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
47using internal::Int64;
48using internal::Uint32;
49
50class T32CodeAddressIncrementer {
51  uint32_t* code_address_;
52  uint32_t increment_;
53
54 public:
55  T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address)
56      : code_address_(code_address),
57        increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {}
58  ~T32CodeAddressIncrementer() { *code_address_ += increment_; }
59};
60
61class A32CodeAddressIncrementer {
62  uint32_t* code_address_;
63
64 public:
65  explicit A32CodeAddressIncrementer(uint32_t* code_address)
66      : code_address_(code_address) {}
67  ~A32CodeAddressIncrementer() { *code_address_ += 4; }
68};
69
70class DecodeNeon {
71  int lane_;
72  SpacingType spacing_;
73  bool valid_;
74
75 public:
76  DecodeNeon(int lane, SpacingType spacing)
77      : lane_(lane), spacing_(spacing), valid_(true) {}
78  DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {}
79  int GetLane() const { return lane_; }
80  SpacingType GetSpacing() const { return spacing_; }
81  bool IsValid() const { return valid_; }
82};
83
84class DecodeNeonAndAlign : public DecodeNeon {
85 public:
86  Alignment align_;
87  DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align)
88      : DecodeNeon(lanes, spacing), align_(align) {}
89  DecodeNeonAndAlign() : align_(kBadAlignment) {}
90  Alignment GetAlign() const { return align_; }
91};
92
93// Start of generated code.
94DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) {
95  if ((value & 0xf) == 0x1) {
96    switch (type_value) {
97      case 0x0:
98        return S8;
99      case 0x1:
100        return U8;
101    }
102  } else if ((value & 0xe) == 0x2) {
103    switch (type_value) {
104      case 0x0:
105        return S16;
106      case 0x1:
107        return U16;
108    }
109  } else if ((value & 0xc) == 0x4) {
110    switch (type_value) {
111      case 0x0:
112        return S32;
113      case 0x1:
114        return U32;
115    }
116  } else if ((value & 0x8) == 0x8) {
117    switch (type_value) {
118      case 0x0:
119        return S64;
120      case 0x1:
121        return U64;
122    }
123  }
124  return kDataTypeValueInvalid;
125}
126
127DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) {
128  if ((value & 0xf) == 0x1) {
129    if (type_value == 0x1) return S8;
130  } else if ((value & 0xe) == 0x2) {
131    if (type_value == 0x1) return S16;
132  } else if ((value & 0xc) == 0x4) {
133    if (type_value == 0x1) return S32;
134  } else if ((value & 0x8) == 0x8) {
135    if (type_value == 0x1) return S64;
136  }
137  return kDataTypeValueInvalid;
138}
139
140DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) {
141  if ((value & 0xf) == 0x1) {
142    return I8;
143  } else if ((value & 0xe) == 0x2) {
144    return I16;
145  } else if ((value & 0xc) == 0x4) {
146    return I32;
147  } else if ((value & 0x8) == 0x8) {
148    return I64;
149  }
150  return kDataTypeValueInvalid;
151}
152
153DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) {
154  if ((value & 0xf) == 0x1) {
155    return Untyped8;
156  } else if ((value & 0xe) == 0x2) {
157    return Untyped16;
158  } else if ((value & 0xc) == 0x4) {
159    return Untyped32;
160  } else if ((value & 0x8) == 0x8) {
161    return Untyped64;
162  }
163  return kDataTypeValueInvalid;
164}
165
166DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) {
167  if ((value & 0x7) == 0x1) {
168    switch (type_value) {
169      case 0x0:
170        return S16;
171      case 0x1:
172        return U16;
173    }
174  } else if ((value & 0x6) == 0x2) {
175    switch (type_value) {
176      case 0x0:
177        return S32;
178      case 0x1:
179        return U32;
180    }
181  } else if ((value & 0x4) == 0x4) {
182    switch (type_value) {
183      case 0x0:
184        return S64;
185      case 0x1:
186        return U64;
187    }
188  }
189  return kDataTypeValueInvalid;
190}
191
192DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) {
193  if ((value & 0x7) == 0x1) {
194    if (type_value == 0x1) return S16;
195  } else if ((value & 0x6) == 0x2) {
196    if (type_value == 0x1) return S32;
197  } else if ((value & 0x4) == 0x4) {
198    if (type_value == 0x1) return S64;
199  }
200  return kDataTypeValueInvalid;
201}
202
203DataTypeValue Dt_imm6_3_Decode(uint32_t value) {
204  if ((value & 0x7) == 0x1) {
205    return I16;
206  } else if ((value & 0x6) == 0x2) {
207    return I32;
208  } else if ((value & 0x4) == 0x4) {
209    return I64;
210  }
211  return kDataTypeValueInvalid;
212}
213
214DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) {
215  if ((value & 0x7) == 0x1) {
216    switch (type_value) {
217      case 0x0:
218        return S8;
219      case 0x1:
220        return U8;
221    }
222  } else if ((value & 0x6) == 0x2) {
223    switch (type_value) {
224      case 0x0:
225        return S16;
226      case 0x1:
227        return U16;
228    }
229  } else if ((value & 0x4) == 0x4) {
230    switch (type_value) {
231      case 0x0:
232        return S32;
233      case 0x1:
234        return U32;
235    }
236  }
237  return kDataTypeValueInvalid;
238}
239
240DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) {
241  switch (value) {
242    case 0x0:
243      return S8;
244    case 0x1:
245      return S16;
246    case 0x2:
247      return S32;
248    case 0x4:
249      return U8;
250    case 0x5:
251      return U16;
252    case 0x6:
253      return U32;
254    case 0x8:
255      return P8;
256    case 0xa:
257      return P64;
258  }
259  return kDataTypeValueInvalid;
260}
261
262DataTypeValue Dt_op_size_1_Decode(uint32_t value) {
263  switch (value) {
264    case 0x0:
265      return I8;
266    case 0x1:
267      return I16;
268    case 0x2:
269      return I32;
270    case 0x4:
271      return P8;
272  }
273  return kDataTypeValueInvalid;
274}
275
276DataTypeValue Dt_op_size_2_Decode(uint32_t value) {
277  switch (value) {
278    case 0x0:
279      return S8;
280    case 0x1:
281      return S16;
282    case 0x2:
283      return S32;
284    case 0x4:
285      return U8;
286    case 0x5:
287      return U16;
288    case 0x6:
289      return U32;
290  }
291  return kDataTypeValueInvalid;
292}
293
294DataTypeValue Dt_op_size_3_Decode(uint32_t value) {
295  switch (value) {
296    case 0x0:
297      return S16;
298    case 0x1:
299      return S32;
300    case 0x2:
301      return S64;
302    case 0x4:
303      return U16;
304    case 0x5:
305      return U32;
306    case 0x6:
307      return U64;
308  }
309  return kDataTypeValueInvalid;
310}
311
312DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) {
313  switch (value) {
314    case 0x1:
315      return S8;
316    case 0x2:
317      return S16;
318    case 0x4:
319      return S32;
320    case 0x9:
321      return U8;
322    case 0xa:
323      return U16;
324    case 0xc:
325      return U32;
326  }
327  return kDataTypeValueInvalid;
328}
329
330DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
331  if ((value & 0x18) == 0x8) {
332    *lane = value & 7;
333    return S8;
334  }
335  if ((value & 0x19) == 0x1) {
336    *lane = (value >> 1) & 3;
337    return S16;
338  }
339  if ((value & 0x18) == 0x18) {
340    *lane = value & 7;
341    return U8;
342  }
343  if ((value & 0x19) == 0x11) {
344    *lane = (value >> 1) & 3;
345    return U16;
346  }
347  if ((value & 0x1b) == 0x0) {
348    *lane = (value >> 2) & 1;
349    return Untyped32;
350  }
351  *lane = ~0U;
352  return kDataTypeValueInvalid;
353}
354
355DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
356  if ((value & 0x8) == 0x8) {
357    *lane = value & 7;
358    return Untyped8;
359  }
360  if ((value & 0x9) == 0x1) {
361    *lane = (value >> 1) & 3;
362    return Untyped16;
363  }
364  if ((value & 0xb) == 0x0) {
365    *lane = (value >> 2) & 1;
366    return Untyped32;
367  }
368  *lane = ~0U;
369  return kDataTypeValueInvalid;
370}
371
372DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) {
373  if ((value & 0x1) == 0x1) {
374    *lane = (value >> 1) & 7;
375    return Untyped8;
376  }
377  if ((value & 0x3) == 0x2) {
378    *lane = (value >> 2) & 3;
379    return Untyped16;
380  }
381  if ((value & 0x7) == 0x4) {
382    *lane = (value >> 3) & 1;
383    return Untyped32;
384  }
385  *lane = ~0U;
386  return kDataTypeValueInvalid;
387}
388
389DataTypeValue Dt_B_E_1_Decode(uint32_t value) {
390  switch (value) {
391    case 0x2:
392      return Untyped8;
393    case 0x1:
394      return Untyped16;
395    case 0x0:
396      return Untyped32;
397  }
398  return kDataTypeValueInvalid;
399}
400
401DataTypeValue Dt_op_1_Decode1(uint32_t value) {
402  switch (value) {
403    case 0x0:
404      return F32;
405    case 0x1:
406      return F32;
407    case 0x2:
408      return S32;
409    case 0x3:
410      return U32;
411  }
412  return kDataTypeValueInvalid;
413}
414
415DataTypeValue Dt_op_1_Decode2(uint32_t value) {
416  switch (value) {
417    case 0x0:
418      return S32;
419    case 0x1:
420      return U32;
421    case 0x2:
422      return F32;
423    case 0x3:
424      return F32;
425  }
426  return kDataTypeValueInvalid;
427}
428
429DataTypeValue Dt_op_2_Decode(uint32_t value) {
430  switch (value) {
431    case 0x0:
432      return U32;
433    case 0x1:
434      return S32;
435  }
436  return kDataTypeValueInvalid;
437}
438
439DataTypeValue Dt_op_3_Decode(uint32_t value) {
440  switch (value) {
441    case 0x0:
442      return S32;
443    case 0x1:
444      return U32;
445  }
446  return kDataTypeValueInvalid;
447}
448
449DataTypeValue Dt_U_sx_1_Decode(uint32_t value) {
450  switch (value) {
451    case 0x0:
452      return S16;
453    case 0x1:
454      return S32;
455    case 0x2:
456      return U16;
457    case 0x3:
458      return U32;
459  }
460  return kDataTypeValueInvalid;
461}
462
463DataTypeValue Dt_op_U_1_Decode1(uint32_t value) {
464  switch (value) {
465    case 0x0:
466      return F32;
467    case 0x1:
468      return F32;
469    case 0x2:
470      return S32;
471    case 0x3:
472      return U32;
473  }
474  return kDataTypeValueInvalid;
475}
476
477DataTypeValue Dt_op_U_1_Decode2(uint32_t value) {
478  switch (value) {
479    case 0x0:
480      return S32;
481    case 0x1:
482      return U32;
483    case 0x2:
484      return F32;
485    case 0x3:
486      return F32;
487  }
488  return kDataTypeValueInvalid;
489}
490
491DataTypeValue Dt_sz_1_Decode(uint32_t value) {
492  switch (value) {
493    case 0x0:
494      return F32;
495  }
496  return kDataTypeValueInvalid;
497}
498
499DataTypeValue Dt_F_size_1_Decode(uint32_t value) {
500  switch (value) {
501    case 0x0:
502      return S8;
503    case 0x1:
504      return S16;
505    case 0x2:
506      return S32;
507    case 0x6:
508      return F32;
509  }
510  return kDataTypeValueInvalid;
511}
512
513DataTypeValue Dt_F_size_2_Decode(uint32_t value) {
514  switch (value) {
515    case 0x0:
516      return I8;
517    case 0x1:
518      return I16;
519    case 0x2:
520      return I32;
521    case 0x6:
522      return F32;
523  }
524  return kDataTypeValueInvalid;
525}
526
527DataTypeValue Dt_F_size_3_Decode(uint32_t value) {
528  switch (value) {
529    case 0x1:
530      return I16;
531    case 0x2:
532      return I32;
533    case 0x6:
534      return F32;
535  }
536  return kDataTypeValueInvalid;
537}
538
539DataTypeValue Dt_F_size_4_Decode(uint32_t value) {
540  switch (value) {
541    case 0x2:
542      return U32;
543    case 0x6:
544      return F32;
545  }
546  return kDataTypeValueInvalid;
547}
548
549DataTypeValue Dt_U_size_1_Decode(uint32_t value) {
550  switch (value) {
551    case 0x0:
552      return S8;
553    case 0x1:
554      return S16;
555    case 0x2:
556      return S32;
557    case 0x4:
558      return U8;
559    case 0x5:
560      return U16;
561    case 0x6:
562      return U32;
563  }
564  return kDataTypeValueInvalid;
565}
566
567DataTypeValue Dt_U_size_2_Decode(uint32_t value) {
568  switch (value) {
569    case 0x1:
570      return S16;
571    case 0x2:
572      return S32;
573    case 0x5:
574      return U16;
575    case 0x6:
576      return U32;
577  }
578  return kDataTypeValueInvalid;
579}
580
581DataTypeValue Dt_U_size_3_Decode(uint32_t value) {
582  switch (value) {
583    case 0x0:
584      return S8;
585    case 0x1:
586      return S16;
587    case 0x2:
588      return S32;
589    case 0x3:
590      return S64;
591    case 0x4:
592      return U8;
593    case 0x5:
594      return U16;
595    case 0x6:
596      return U32;
597    case 0x7:
598      return U64;
599  }
600  return kDataTypeValueInvalid;
601}
602
603DataTypeValue Dt_size_1_Decode(uint32_t value) {
604  switch (value) {
605    case 0x0:
606      return Untyped8;
607  }
608  return kDataTypeValueInvalid;
609}
610
611DataTypeValue Dt_size_2_Decode(uint32_t value) {
612  switch (value) {
613    case 0x0:
614      return I8;
615    case 0x1:
616      return I16;
617    case 0x2:
618      return I32;
619    case 0x3:
620      return I64;
621  }
622  return kDataTypeValueInvalid;
623}
624
625DataTypeValue Dt_size_3_Decode(uint32_t value) {
626  switch (value) {
627    case 0x0:
628      return I16;
629    case 0x1:
630      return I32;
631    case 0x2:
632      return I64;
633  }
634  return kDataTypeValueInvalid;
635}
636
637DataTypeValue Dt_size_4_Decode(uint32_t value) {
638  switch (value) {
639    case 0x0:
640      return I8;
641    case 0x1:
642      return I16;
643    case 0x2:
644      return I32;
645  }
646  return kDataTypeValueInvalid;
647}
648
649DataTypeValue Dt_size_5_Decode(uint32_t value) {
650  switch (value) {
651    case 0x0:
652      return S8;
653    case 0x1:
654      return S16;
655    case 0x2:
656      return S32;
657  }
658  return kDataTypeValueInvalid;
659}
660
661DataTypeValue Dt_size_6_Decode(uint32_t value) {
662  switch (value) {
663    case 0x0:
664      return Untyped8;
665    case 0x1:
666      return Untyped16;
667    case 0x2:
668      return Untyped32;
669    case 0x3:
670      return Untyped64;
671  }
672  return kDataTypeValueInvalid;
673}
674
675DataTypeValue Dt_size_7_Decode(uint32_t value) {
676  switch (value) {
677    case 0x0:
678      return Untyped8;
679    case 0x1:
680      return Untyped16;
681    case 0x2:
682      return Untyped32;
683  }
684  return kDataTypeValueInvalid;
685}
686
687DataTypeValue Dt_size_8_Decode(uint32_t value) {
688  switch (value) {
689    case 0x0:
690      return Untyped8;
691    case 0x1:
692      return Untyped16;
693    case 0x2:
694      return Untyped32;
695    case 0x3:
696      return Untyped32;
697  }
698  return kDataTypeValueInvalid;
699}
700
701DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) {
702  switch (value) {
703    case 0x1:
704      switch (type_value) {
705        case 0x0:
706          return I16;
707      }
708      break;
709    case 0x2:
710      switch (type_value) {
711        case 0x0:
712          return I32;
713        case 0x1:
714          return F32;
715      }
716      break;
717  }
718  return kDataTypeValueInvalid;
719}
720
721DataTypeValue Dt_size_10_Decode(uint32_t value) {
722  switch (value) {
723    case 0x0:
724      return I8;
725    case 0x1:
726      return I16;
727    case 0x2:
728      return I32;
729  }
730  return kDataTypeValueInvalid;
731}
732
733DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) {
734  switch (value) {
735    case 0x1:
736      switch (type_value) {
737        case 0x0:
738          return S16;
739        case 0x1:
740          return U16;
741      }
742      break;
743    case 0x2:
744      switch (type_value) {
745        case 0x0:
746          return S32;
747        case 0x1:
748          return U32;
749      }
750      break;
751  }
752  return kDataTypeValueInvalid;
753}
754
755DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) {
756  switch (value) {
757    case 0x0:
758      switch (type_value) {
759        case 0x0:
760          return S8;
761        case 0x1:
762          return U8;
763      }
764      break;
765    case 0x1:
766      switch (type_value) {
767        case 0x0:
768          return S16;
769        case 0x1:
770          return U16;
771      }
772      break;
773    case 0x2:
774      switch (type_value) {
775        case 0x0:
776          return S32;
777        case 0x1:
778          return U32;
779      }
780      break;
781  }
782  return kDataTypeValueInvalid;
783}
784
785DataTypeValue Dt_size_13_Decode(uint32_t value) {
786  switch (value) {
787    case 0x1:
788      return S16;
789    case 0x2:
790      return S32;
791  }
792  return kDataTypeValueInvalid;
793}
794
795DataTypeValue Dt_size_14_Decode(uint32_t value) {
796  switch (value) {
797    case 0x0:
798      return S16;
799    case 0x1:
800      return S32;
801    case 0x2:
802      return S64;
803  }
804  return kDataTypeValueInvalid;
805}
806
807DataTypeValue Dt_size_15_Decode(uint32_t value) {
808  switch (value) {
809    case 0x0:
810      return Untyped8;
811    case 0x1:
812      return Untyped16;
813  }
814  return kDataTypeValueInvalid;
815}
816
817DataTypeValue Dt_size_16_Decode(uint32_t value) {
818  switch (value) {
819    case 0x2:
820      return F32;
821  }
822  return kDataTypeValueInvalid;
823}
824
825DataTypeValue Dt_size_17_Decode(uint32_t value) {
826  switch (value) {
827    case 0x0:
828      return I8;
829    case 0x1:
830      return I16;
831    case 0x2:
832      return I32;
833  }
834  return kDataTypeValueInvalid;
835}
836
837DecodeNeon Index_1_Decode(uint32_t value, DataType dt) {
838  switch (dt.GetValue()) {
839    case Untyped8: {
840      int lane = (value >> 1) & 0x7;
841      if ((value & 1) != 0) break;
842      SpacingType spacing = kSingle;
843      return DecodeNeon(lane, spacing);
844    }
845    case Untyped16: {
846      int lane = (value >> 2) & 0x3;
847      if ((value & 1) != 0) break;
848      SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle;
849      return DecodeNeon(lane, spacing);
850    }
851    case Untyped32: {
852      int lane = (value >> 3) & 0x1;
853      if ((value & 3) != 0) break;
854      SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle;
855      return DecodeNeon(lane, spacing);
856    }
857    default:
858      break;
859  }
860  return DecodeNeon();
861}
862
863DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) {
864  switch (dt.GetValue()) {
865    case Untyped8: {
866      AlignmentType align;
867      if ((value & 1) == 0) {
868        align = kNoAlignment;
869      } else {
870        break;
871      }
872      int lane = (value >> 1) & 0x7;
873      SpacingType spacing = kSingle;
874      return DecodeNeonAndAlign(lane, spacing, align);
875    }
876    case Untyped16: {
877      AlignmentType align;
878      if ((value & 3) == 1) {
879        align = k16BitAlign;
880      } else if ((value & 3) == 0) {
881        align = kNoAlignment;
882      } else {
883        break;
884      }
885      int lane = (value >> 2) & 0x3;
886      SpacingType spacing = kSingle;
887      return DecodeNeonAndAlign(lane, spacing, align);
888    }
889    case Untyped32: {
890      AlignmentType align;
891      if ((value & 7) == 3) {
892        align = k32BitAlign;
893      } else if ((value & 7) == 0) {
894        align = kNoAlignment;
895      } else {
896        break;
897      }
898      int lane = (value >> 3) & 0x1;
899      SpacingType spacing = kSingle;
900      return DecodeNeonAndAlign(lane, spacing, align);
901    }
902    default:
903      break;
904  }
905  return DecodeNeonAndAlign();
906}
907
908DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) {
909  switch (dt.GetValue()) {
910    case Untyped8: {
911      AlignmentType align;
912      if ((value & 1) == 1) {
913        align = k16BitAlign;
914      } else if ((value & 1) == 0) {
915        align = kNoAlignment;
916      } else {
917        break;
918      }
919      int lane = (value >> 1) & 0x7;
920      SpacingType spacing = kSingle;
921      return DecodeNeonAndAlign(lane, spacing, align);
922    }
923    case Untyped16: {
924      AlignmentType align;
925      if ((value & 1) == 1) {
926        align = k32BitAlign;
927      } else if ((value & 1) == 0) {
928        align = kNoAlignment;
929      } else {
930        break;
931      }
932      int lane = (value >> 2) & 0x3;
933      SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
934      return DecodeNeonAndAlign(lane, spacing, align);
935    }
936    case Untyped32: {
937      AlignmentType align;
938      if ((value & 3) == 1) {
939        align = k64BitAlign;
940      } else if ((value & 3) == 0) {
941        align = kNoAlignment;
942      } else {
943        break;
944      }
945      int lane = (value >> 3) & 0x1;
946      SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
947      return DecodeNeonAndAlign(lane, spacing, align);
948    }
949    default:
950      break;
951  }
952  return DecodeNeonAndAlign();
953}
954
955DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) {
956  switch (dt.GetValue()) {
957    case Untyped8: {
958      AlignmentType align;
959      if ((value & 1) == 1) {
960        align = k32BitAlign;
961      } else if ((value & 1) == 0) {
962        align = kNoAlignment;
963      } else {
964        break;
965      }
966      int lane = (value >> 1) & 0x7;
967      SpacingType spacing = kSingle;
968      return DecodeNeonAndAlign(lane, spacing, align);
969    }
970    case Untyped16: {
971      AlignmentType align;
972      if ((value & 1) == 1) {
973        align = k64BitAlign;
974      } else if ((value & 1) == 0) {
975        align = kNoAlignment;
976      } else {
977        break;
978      }
979      int lane = (value >> 2) & 0x3;
980      SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
981      return DecodeNeonAndAlign(lane, spacing, align);
982    }
983    case Untyped32: {
984      AlignmentType align;
985      if ((value & 3) == 1) {
986        align = k64BitAlign;
987      } else if ((value & 3) == 2) {
988        align = k128BitAlign;
989      } else if ((value & 3) == 0) {
990        align = kNoAlignment;
991      } else {
992        break;
993      }
994      int lane = (value >> 3) & 0x1;
995      SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
996      return DecodeNeonAndAlign(lane, spacing, align);
997    }
998    default:
999      break;
1000  }
1001  return DecodeNeonAndAlign();
1002}
1003
1004Alignment Align_a_1_Decode(uint32_t value, DataType dt) {
1005  switch (value) {
1006    case 0:
1007      return kNoAlignment;
1008    case 1:
1009      if (dt.Is(Untyped16)) return k16BitAlign;
1010      if (dt.Is(Untyped32)) return k32BitAlign;
1011      break;
1012    default:
1013      break;
1014  }
1015  return kBadAlignment;
1016}
1017
1018Alignment Align_a_2_Decode(uint32_t value, DataType dt) {
1019  switch (value) {
1020    case 0:
1021      return kNoAlignment;
1022    case 1:
1023      if (dt.Is(Untyped8)) return k16BitAlign;
1024      if (dt.Is(Untyped16)) return k32BitAlign;
1025      if (dt.Is(Untyped32)) return k64BitAlign;
1026      break;
1027    default:
1028      break;
1029  }
1030  return kBadAlignment;
1031}
1032
1033Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) {
1034  switch (value) {
1035    case 0:
1036      if (size != 3) return kNoAlignment;
1037      break;
1038    case 1:
1039      if (dt.Is(Untyped8)) return k32BitAlign;
1040      if (dt.Is(Untyped16)) return k64BitAlign;
1041      if (size == 2) return k64BitAlign;
1042      if (size == 3) return k128BitAlign;
1043      break;
1044    default:
1045      break;
1046  }
1047  return kBadAlignment;
1048}
1049
1050Alignment Align_align_1_Decode(uint32_t value) {
1051  switch (value) {
1052    case 0:
1053      return kNoAlignment;
1054    case 1:
1055      return k64BitAlign;
1056    case 2:
1057      return k128BitAlign;
1058    case 3:
1059      return k256BitAlign;
1060    default:
1061      break;
1062  }
1063  return kBadAlignment;
1064}
1065
1066Alignment Align_align_2_Decode(uint32_t value) {
1067  switch (value) {
1068    case 0:
1069      return kNoAlignment;
1070    case 1:
1071      return k64BitAlign;
1072    case 2:
1073      return k128BitAlign;
1074    case 3:
1075      return k256BitAlign;
1076    default:
1077      break;
1078  }
1079  return kBadAlignment;
1080}
1081
1082Alignment Align_align_3_Decode(uint32_t value) {
1083  switch (value) {
1084    case 0:
1085      return kNoAlignment;
1086    case 1:
1087      return k64BitAlign;
1088    default:
1089      break;
1090  }
1091  return kBadAlignment;
1092}
1093
1094Alignment Align_align_4_Decode(uint32_t value) {
1095  switch (value) {
1096    case 0:
1097      return kNoAlignment;
1098    case 1:
1099      return k64BitAlign;
1100    case 2:
1101      return k128BitAlign;
1102    case 3:
1103      return k256BitAlign;
1104    default:
1105      break;
1106  }
1107  return kBadAlignment;
1108}
1109
1110Alignment Align_align_5_Decode(uint32_t value) {
1111  switch (value) {
1112    case 0:
1113      return kNoAlignment;
1114    case 1:
1115      return k64BitAlign;
1116    case 2:
1117      return k128BitAlign;
1118    case 3:
1119      return k256BitAlign;
1120    default:
1121      break;
1122  }
1123  return kBadAlignment;
1124}
1125
1126
1127void Disassembler::adc(Condition cond,
1128                       EncodingSize size,
1129                       Register rd,
1130                       Register rn,
1131                       const Operand& operand) {
1132  os().SetCurrentInstruction(kAdc, kArithmetic);
1133  os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size;
1134  os() << " ";
1135  if (!rd.Is(rn) || !use_short_hand_form_) {
1136    os() << rd << ", ";
1137  }
1138  os() << rn << ", " << operand;
1139}
1140
1141void Disassembler::adcs(Condition cond,
1142                        EncodingSize size,
1143                        Register rd,
1144                        Register rn,
1145                        const Operand& operand) {
1146  os().SetCurrentInstruction(kAdcs, kArithmetic);
1147  os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size;
1148  os() << " ";
1149  if (!rd.Is(rn) || !use_short_hand_form_) {
1150    os() << rd << ", ";
1151  }
1152  os() << rn << ", " << operand;
1153}
1154
1155void Disassembler::add(Condition cond,
1156                       EncodingSize size,
1157                       Register rd,
1158                       Register rn,
1159                       const Operand& operand) {
1160  os().SetCurrentInstruction(kAdd, kArithmetic);
1161  os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size;
1162  os() << " ";
1163  if (!rd.Is(rn) || !use_short_hand_form_) {
1164    os() << rd << ", ";
1165  }
1166  os() << rn << ", " << operand;
1167}
1168
1169void Disassembler::add(Condition cond, Register rd, const Operand& operand) {
1170  os().SetCurrentInstruction(kAdd, kArithmetic);
1171  os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd
1172       << ", " << operand;
1173}
1174
1175void Disassembler::adds(Condition cond,
1176                        EncodingSize size,
1177                        Register rd,
1178                        Register rn,
1179                        const Operand& operand) {
1180  os().SetCurrentInstruction(kAdds, kArithmetic);
1181  os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size;
1182  os() << " ";
1183  if (!rd.Is(rn) || !use_short_hand_form_) {
1184    os() << rd << ", ";
1185  }
1186  os() << rn << ", " << operand;
1187}
1188
1189void Disassembler::adds(Register rd, const Operand& operand) {
1190  os().SetCurrentInstruction(kAdds, kArithmetic);
1191  os() << ToCString(kAdds) << " " << rd << ", " << operand;
1192}
1193
1194void Disassembler::addw(Condition cond,
1195                        Register rd,
1196                        Register rn,
1197                        const Operand& operand) {
1198  os().SetCurrentInstruction(kAddw, kArithmetic);
1199  os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond);
1200  os() << " ";
1201  if (!rd.Is(rn) || !use_short_hand_form_) {
1202    os() << rd << ", ";
1203  }
1204  os() << rn << ", " << operand;
1205}
1206
1207void Disassembler::adr(Condition cond,
1208                       EncodingSize size,
1209                       Register rd,
1210                       Location* location) {
1211  os().SetCurrentInstruction(kAdr, kAddress);
1212  os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " "
1213       << rd << ", "
1214       << PrintLabel(kAnyLocation, location, GetCodeAddress() & ~3);
1215}
1216
1217void Disassembler::and_(Condition cond,
1218                        EncodingSize size,
1219                        Register rd,
1220                        Register rn,
1221                        const Operand& operand) {
1222  os().SetCurrentInstruction(kAnd, kBitwise);
1223  os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size;
1224  os() << " ";
1225  if (!rd.Is(rn) || !use_short_hand_form_) {
1226    os() << rd << ", ";
1227  }
1228  os() << rn << ", " << operand;
1229}
1230
1231void Disassembler::ands(Condition cond,
1232                        EncodingSize size,
1233                        Register rd,
1234                        Register rn,
1235                        const Operand& operand) {
1236  os().SetCurrentInstruction(kAnds, kBitwise);
1237  os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size;
1238  os() << " ";
1239  if (!rd.Is(rn) || !use_short_hand_form_) {
1240    os() << rd << ", ";
1241  }
1242  os() << rn << ", " << operand;
1243}
1244
1245void Disassembler::asr(Condition cond,
1246                       EncodingSize size,
1247                       Register rd,
1248                       Register rm,
1249                       const Operand& operand) {
1250  os().SetCurrentInstruction(kAsr, kShift);
1251  os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size;
1252  os() << " ";
1253  if (!rd.Is(rm) || !use_short_hand_form_) {
1254    os() << rd << ", ";
1255  }
1256  os() << rm << ", " << operand;
1257}
1258
1259void Disassembler::asrs(Condition cond,
1260                        EncodingSize size,
1261                        Register rd,
1262                        Register rm,
1263                        const Operand& operand) {
1264  os().SetCurrentInstruction(kAsrs, kShift);
1265  os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size;
1266  os() << " ";
1267  if (!rd.Is(rm) || !use_short_hand_form_) {
1268    os() << rd << ", ";
1269  }
1270  os() << rm << ", " << operand;
1271}
1272
1273void Disassembler::b(Condition cond, EncodingSize size, Location* location) {
1274  os().SetCurrentInstruction(kB, kAddress | kBranch);
1275  os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " "
1276       << PrintLabel(kCodeLocation, location, GetCodeAddress());
1277}
1278
1279void Disassembler::bfc(Condition cond,
1280                       Register rd,
1281                       uint32_t lsb,
1282                       uint32_t width) {
1283  os().SetCurrentInstruction(kBfc, kShift);
1284  os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd
1285       << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width);
1286}
1287
1288void Disassembler::bfi(
1289    Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
1290  os().SetCurrentInstruction(kBfi, kShift);
1291  os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd
1292       << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
1293       << ImmediatePrinter(width);
1294}
1295
1296void Disassembler::bic(Condition cond,
1297                       EncodingSize size,
1298                       Register rd,
1299                       Register rn,
1300                       const Operand& operand) {
1301  os().SetCurrentInstruction(kBic, kBitwise);
1302  os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size;
1303  os() << " ";
1304  if (!rd.Is(rn) || !use_short_hand_form_) {
1305    os() << rd << ", ";
1306  }
1307  os() << rn << ", " << operand;
1308}
1309
1310void Disassembler::bics(Condition cond,
1311                        EncodingSize size,
1312                        Register rd,
1313                        Register rn,
1314                        const Operand& operand) {
1315  os().SetCurrentInstruction(kBics, kBitwise);
1316  os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size;
1317  os() << " ";
1318  if (!rd.Is(rn) || !use_short_hand_form_) {
1319    os() << rd << ", ";
1320  }
1321  os() << rn << ", " << operand;
1322}
1323
1324void Disassembler::bkpt(Condition cond, uint32_t imm) {
1325  os().SetCurrentInstruction(kBkpt, kSystem);
1326  os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " "
1327       << RawImmediatePrinter(imm);
1328}
1329
1330void Disassembler::bl(Condition cond, Location* location) {
1331  os().SetCurrentInstruction(kBl, kAddress | kBranch);
1332  os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " "
1333       << PrintLabel(kCodeLocation, location, GetCodeAddress());
1334}
1335
1336void Disassembler::blx(Condition cond, Location* location) {
1337  os().SetCurrentInstruction(kBlx, kAddress | kBranch);
1338  os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " "
1339       << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
1340}
1341
1342void Disassembler::blx(Condition cond, Register rm) {
1343  os().SetCurrentInstruction(kBlx, kAddress | kBranch);
1344  os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm;
1345}
1346
1347void Disassembler::bx(Condition cond, Register rm) {
1348  os().SetCurrentInstruction(kBx, kAddress | kBranch);
1349  os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm;
1350}
1351
1352void Disassembler::bxj(Condition cond, Register rm) {
1353  os().SetCurrentInstruction(kBxj, kAddress | kBranch);
1354  os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm;
1355}
1356
1357void Disassembler::cbnz(Register rn, Location* location) {
1358  os().SetCurrentInstruction(kCbnz, kAddress | kBranch);
1359  os() << ToCString(kCbnz) << " " << rn << ", "
1360       << PrintLabel(kCodeLocation, location, GetCodeAddress());
1361}
1362
1363void Disassembler::cbz(Register rn, Location* location) {
1364  os().SetCurrentInstruction(kCbz, kAddress | kBranch);
1365  os() << ToCString(kCbz) << " " << rn << ", "
1366       << PrintLabel(kCodeLocation, location, GetCodeAddress());
1367}
1368
1369void Disassembler::clrex(Condition cond) {
1370  os().SetCurrentInstruction(kClrex, kNoAttribute);
1371  os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond);
1372}
1373
1374void Disassembler::clz(Condition cond, Register rd, Register rm) {
1375  os().SetCurrentInstruction(kClz, kNoAttribute);
1376  os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd
1377       << ", " << rm;
1378}
1379
1380void Disassembler::cmn(Condition cond,
1381                       EncodingSize size,
1382                       Register rn,
1383                       const Operand& operand) {
1384  os().SetCurrentInstruction(kCmn, kArithmetic);
1385  os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " "
1386       << rn << ", " << operand;
1387}
1388
1389void Disassembler::cmp(Condition cond,
1390                       EncodingSize size,
1391                       Register rn,
1392                       const Operand& operand) {
1393  os().SetCurrentInstruction(kCmp, kArithmetic);
1394  os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " "
1395       << rn << ", " << operand;
1396}
1397
1398void Disassembler::crc32b(Condition cond,
1399                          Register rd,
1400                          Register rn,
1401                          Register rm) {
1402  os().SetCurrentInstruction(kCrc32b, kNoAttribute);
1403  os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd
1404       << ", " << rn << ", " << rm;
1405}
1406
1407void Disassembler::crc32cb(Condition cond,
1408                           Register rd,
1409                           Register rn,
1410                           Register rm) {
1411  os().SetCurrentInstruction(kCrc32cb, kNoAttribute);
1412  os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd
1413       << ", " << rn << ", " << rm;
1414}
1415
1416void Disassembler::crc32ch(Condition cond,
1417                           Register rd,
1418                           Register rn,
1419                           Register rm) {
1420  os().SetCurrentInstruction(kCrc32ch, kNoAttribute);
1421  os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd
1422       << ", " << rn << ", " << rm;
1423}
1424
1425void Disassembler::crc32cw(Condition cond,
1426                           Register rd,
1427                           Register rn,
1428                           Register rm) {
1429  os().SetCurrentInstruction(kCrc32cw, kNoAttribute);
1430  os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd
1431       << ", " << rn << ", " << rm;
1432}
1433
1434void Disassembler::crc32h(Condition cond,
1435                          Register rd,
1436                          Register rn,
1437                          Register rm) {
1438  os().SetCurrentInstruction(kCrc32h, kNoAttribute);
1439  os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd
1440       << ", " << rn << ", " << rm;
1441}
1442
1443void Disassembler::crc32w(Condition cond,
1444                          Register rd,
1445                          Register rn,
1446                          Register rm) {
1447  os().SetCurrentInstruction(kCrc32w, kNoAttribute);
1448  os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd
1449       << ", " << rn << ", " << rm;
1450}
1451
1452void Disassembler::dmb(Condition cond, MemoryBarrier option) {
1453  os().SetCurrentInstruction(kDmb, kNoAttribute);
1454  os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option;
1455}
1456
1457void Disassembler::dsb(Condition cond, MemoryBarrier option) {
1458  os().SetCurrentInstruction(kDsb, kNoAttribute);
1459  os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option;
1460}
1461
1462void Disassembler::eor(Condition cond,
1463                       EncodingSize size,
1464                       Register rd,
1465                       Register rn,
1466                       const Operand& operand) {
1467  os().SetCurrentInstruction(kEor, kBitwise);
1468  os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size;
1469  os() << " ";
1470  if (!rd.Is(rn) || !use_short_hand_form_) {
1471    os() << rd << ", ";
1472  }
1473  os() << rn << ", " << operand;
1474}
1475
1476void Disassembler::eors(Condition cond,
1477                        EncodingSize size,
1478                        Register rd,
1479                        Register rn,
1480                        const Operand& operand) {
1481  os().SetCurrentInstruction(kEors, kBitwise);
1482  os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size;
1483  os() << " ";
1484  if (!rd.Is(rn) || !use_short_hand_form_) {
1485    os() << rd << ", ";
1486  }
1487  os() << rn << ", " << operand;
1488}
1489
1490void Disassembler::fldmdbx(Condition cond,
1491                           Register rn,
1492                           WriteBack write_back,
1493                           DRegisterList dreglist) {
1494  os().SetCurrentInstruction(kFldmdbx,
1495                             kLoadStore | kLoadStoreMultiple | kFpNeon);
1496  os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
1497       << write_back << ", " << dreglist;
1498}
1499
1500void Disassembler::fldmiax(Condition cond,
1501                           Register rn,
1502                           WriteBack write_back,
1503                           DRegisterList dreglist) {
1504  os().SetCurrentInstruction(kFldmiax,
1505                             kLoadStore | kLoadStoreMultiple | kFpNeon);
1506  os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn
1507       << write_back << ", " << dreglist;
1508}
1509
1510void Disassembler::fstmdbx(Condition cond,
1511                           Register rn,
1512                           WriteBack write_back,
1513                           DRegisterList dreglist) {
1514  os().SetCurrentInstruction(kFstmdbx,
1515                             kLoadStore | kLoadStoreMultiple | kFpNeon);
1516  os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
1517       << write_back << ", " << dreglist;
1518}
1519
1520void Disassembler::fstmiax(Condition cond,
1521                           Register rn,
1522                           WriteBack write_back,
1523                           DRegisterList dreglist) {
1524  os().SetCurrentInstruction(kFstmiax,
1525                             kLoadStore | kLoadStoreMultiple | kFpNeon);
1526  os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn
1527       << write_back << ", " << dreglist;
1528}
1529
1530void Disassembler::hlt(Condition cond, uint32_t imm) {
1531  os().SetCurrentInstruction(kHlt, kSystem);
1532  os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " "
1533       << RawImmediatePrinter(imm);
1534}
1535
1536void Disassembler::hvc(Condition cond, uint32_t imm) {
1537  os().SetCurrentInstruction(kHvc, kSystem);
1538  os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " "
1539       << RawImmediatePrinter(imm);
1540}
1541
1542void Disassembler::isb(Condition cond, MemoryBarrier option) {
1543  os().SetCurrentInstruction(kIsb, kNoAttribute);
1544  os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option;
1545}
1546
1547void Disassembler::it(Condition cond, uint16_t mask) {
1548  os().SetCurrentInstruction(kIt, kNoAttribute);
1549  os() << ToCString(kIt);
1550  int count;
1551  if ((mask & 0x1) != 0) {
1552    count = 3;
1553  } else if ((mask & 0x2) != 0) {
1554    count = 2;
1555  } else if ((mask & 0x4) != 0) {
1556    count = 1;
1557  } else {
1558    count = 0;
1559  }
1560  uint16_t tmp = 0x8;
1561  uint16_t ref = (cond.GetCondition() & 0x1) << 3;
1562  while (count-- > 0) {
1563    os() << (((mask & tmp) == ref) ? "t" : "e");
1564    tmp >>= 1;
1565    ref >>= 1;
1566  }
1567  if (cond.Is(al)) {
1568    os() << " al";
1569  } else {
1570    os() << " " << cond;
1571  }
1572}
1573
1574void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) {
1575  os().SetCurrentInstruction(kLda, kAddress | kLoadStore);
1576  os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt
1577       << ", " << PrintMemOperand(kLoadWordLocation, operand);
1578}
1579
1580void Disassembler::ldab(Condition cond,
1581                        Register rt,
1582                        const MemOperand& operand) {
1583  os().SetCurrentInstruction(kLdab, kAddress | kLoadStore);
1584  os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt
1585       << ", " << PrintMemOperand(kLoadByteLocation, operand);
1586}
1587
1588void Disassembler::ldaex(Condition cond,
1589                         Register rt,
1590                         const MemOperand& operand) {
1591  os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore);
1592  os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt
1593       << ", " << PrintMemOperand(kLoadWordLocation, operand);
1594}
1595
1596void Disassembler::ldaexb(Condition cond,
1597                          Register rt,
1598                          const MemOperand& operand) {
1599  os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore);
1600  os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt
1601       << ", " << PrintMemOperand(kLoadByteLocation, operand);
1602}
1603
1604void Disassembler::ldaexd(Condition cond,
1605                          Register rt,
1606                          Register rt2,
1607                          const MemOperand& operand) {
1608  os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore);
1609  os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt
1610       << ", " << rt2 << ", "
1611       << PrintMemOperand(kLoadDoubleWordLocation, operand);
1612}
1613
1614void Disassembler::ldaexh(Condition cond,
1615                          Register rt,
1616                          const MemOperand& operand) {
1617  os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore);
1618  os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt
1619       << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1620}
1621
1622void Disassembler::ldah(Condition cond,
1623                        Register rt,
1624                        const MemOperand& operand) {
1625  os().SetCurrentInstruction(kLdah, kAddress | kLoadStore);
1626  os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt
1627       << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1628}
1629
1630void Disassembler::ldm(Condition cond,
1631                       EncodingSize size,
1632                       Register rn,
1633                       WriteBack write_back,
1634                       RegisterList registers) {
1635  os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple);
1636  os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " "
1637       << rn << write_back << ", " << registers;
1638}
1639
1640void Disassembler::ldmda(Condition cond,
1641                         Register rn,
1642                         WriteBack write_back,
1643                         RegisterList registers) {
1644  os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple);
1645  os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn
1646       << write_back << ", " << registers;
1647}
1648
1649void Disassembler::ldmdb(Condition cond,
1650                         Register rn,
1651                         WriteBack write_back,
1652                         RegisterList registers) {
1653  os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple);
1654  os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn
1655       << write_back << ", " << registers;
1656}
1657
1658void Disassembler::ldmea(Condition cond,
1659                         Register rn,
1660                         WriteBack write_back,
1661                         RegisterList registers) {
1662  os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple);
1663  os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn
1664       << write_back << ", " << registers;
1665}
1666
1667void Disassembler::ldmed(Condition cond,
1668                         Register rn,
1669                         WriteBack write_back,
1670                         RegisterList registers) {
1671  os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple);
1672  os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn
1673       << write_back << ", " << registers;
1674}
1675
1676void Disassembler::ldmfa(Condition cond,
1677                         Register rn,
1678                         WriteBack write_back,
1679                         RegisterList registers) {
1680  os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple);
1681  os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn
1682       << write_back << ", " << registers;
1683}
1684
1685void Disassembler::ldmfd(Condition cond,
1686                         EncodingSize size,
1687                         Register rn,
1688                         WriteBack write_back,
1689                         RegisterList registers) {
1690  os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple);
1691  os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " "
1692       << rn << write_back << ", " << registers;
1693}
1694
1695void Disassembler::ldmib(Condition cond,
1696                         Register rn,
1697                         WriteBack write_back,
1698                         RegisterList registers) {
1699  os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple);
1700  os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn
1701       << write_back << ", " << registers;
1702}
1703
1704void Disassembler::ldr(Condition cond,
1705                       EncodingSize size,
1706                       Register rt,
1707                       const MemOperand& operand) {
1708  os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
1709  os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
1710       << rt << ", " << PrintMemOperand(kLoadWordLocation, operand);
1711}
1712
1713void Disassembler::ldr(Condition cond,
1714                       EncodingSize size,
1715                       Register rt,
1716                       Location* location) {
1717  os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
1718  os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
1719       << rt << ", "
1720       << PrintLabel(kLoadWordLocation, location, GetCodeAddress() & ~3);
1721}
1722
1723void Disassembler::ldrb(Condition cond,
1724                        EncodingSize size,
1725                        Register rt,
1726                        const MemOperand& operand) {
1727  os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
1728  os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " "
1729       << rt << ", " << PrintMemOperand(kLoadByteLocation, operand);
1730}
1731
1732void Disassembler::ldrb(Condition cond, Register rt, Location* location) {
1733  os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
1734  os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt
1735       << ", "
1736       << PrintLabel(kLoadByteLocation, location, GetCodeAddress() & ~3);
1737}
1738
1739void Disassembler::ldrd(Condition cond,
1740                        Register rt,
1741                        Register rt2,
1742                        const MemOperand& operand) {
1743  os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
1744  os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
1745       << ", " << rt2 << ", "
1746       << PrintMemOperand(kLoadDoubleWordLocation, operand);
1747}
1748
1749void Disassembler::ldrd(Condition cond,
1750                        Register rt,
1751                        Register rt2,
1752                        Location* location) {
1753  os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
1754  os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
1755       << ", " << rt2 << ", "
1756       << PrintLabel(kLoadDoubleWordLocation, location, GetCodeAddress() & ~3);
1757}
1758
1759void Disassembler::ldrex(Condition cond,
1760                         Register rt,
1761                         const MemOperand& operand) {
1762  os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore);
1763  os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt
1764       << ", " << PrintMemOperand(kLoadWordLocation, operand);
1765}
1766
1767void Disassembler::ldrexb(Condition cond,
1768                          Register rt,
1769                          const MemOperand& operand) {
1770  os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore);
1771  os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt
1772       << ", " << PrintMemOperand(kLoadByteLocation, operand);
1773}
1774
1775void Disassembler::ldrexd(Condition cond,
1776                          Register rt,
1777                          Register rt2,
1778                          const MemOperand& operand) {
1779  os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore);
1780  os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt
1781       << ", " << rt2 << ", "
1782       << PrintMemOperand(kLoadDoubleWordLocation, operand);
1783}
1784
1785void Disassembler::ldrexh(Condition cond,
1786                          Register rt,
1787                          const MemOperand& operand) {
1788  os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore);
1789  os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt
1790       << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1791}
1792
1793void Disassembler::ldrh(Condition cond,
1794                        EncodingSize size,
1795                        Register rt,
1796                        const MemOperand& operand) {
1797  os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
1798  os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " "
1799       << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1800}
1801
1802void Disassembler::ldrh(Condition cond, Register rt, Location* location) {
1803  os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
1804  os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt
1805       << ", "
1806       << PrintLabel(kLoadHalfWordLocation, location, GetCodeAddress() & ~3);
1807}
1808
1809void Disassembler::ldrsb(Condition cond,
1810                         EncodingSize size,
1811                         Register rt,
1812                         const MemOperand& operand) {
1813  os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
1814  os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " "
1815       << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand);
1816}
1817
1818void Disassembler::ldrsb(Condition cond, Register rt, Location* location) {
1819  os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
1820  os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt
1821       << ", "
1822       << PrintLabel(kLoadSignedByteLocation, location, GetCodeAddress() & ~3);
1823}
1824
1825void Disassembler::ldrsh(Condition cond,
1826                         EncodingSize size,
1827                         Register rt,
1828                         const MemOperand& operand) {
1829  os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
1830  os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " "
1831       << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand);
1832}
1833
1834void Disassembler::ldrsh(Condition cond, Register rt, Location* location) {
1835  os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
1836  os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt
1837       << ", " << PrintLabel(kLoadSignedHalfWordLocation,
1838                             location,
1839                             GetCodeAddress() & ~3);
1840}
1841
1842void Disassembler::lsl(Condition cond,
1843                       EncodingSize size,
1844                       Register rd,
1845                       Register rm,
1846                       const Operand& operand) {
1847  os().SetCurrentInstruction(kLsl, kShift);
1848  os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size;
1849  os() << " ";
1850  if (!rd.Is(rm) || !use_short_hand_form_) {
1851    os() << rd << ", ";
1852  }
1853  os() << rm << ", " << operand;
1854}
1855
1856void Disassembler::lsls(Condition cond,
1857                        EncodingSize size,
1858                        Register rd,
1859                        Register rm,
1860                        const Operand& operand) {
1861  os().SetCurrentInstruction(kLsls, kShift);
1862  os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size;
1863  os() << " ";
1864  if (!rd.Is(rm) || !use_short_hand_form_) {
1865    os() << rd << ", ";
1866  }
1867  os() << rm << ", " << operand;
1868}
1869
1870void Disassembler::lsr(Condition cond,
1871                       EncodingSize size,
1872                       Register rd,
1873                       Register rm,
1874                       const Operand& operand) {
1875  os().SetCurrentInstruction(kLsr, kShift);
1876  os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size;
1877  os() << " ";
1878  if (!rd.Is(rm) || !use_short_hand_form_) {
1879    os() << rd << ", ";
1880  }
1881  os() << rm << ", " << operand;
1882}
1883
1884void Disassembler::lsrs(Condition cond,
1885                        EncodingSize size,
1886                        Register rd,
1887                        Register rm,
1888                        const Operand& operand) {
1889  os().SetCurrentInstruction(kLsrs, kShift);
1890  os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size;
1891  os() << " ";
1892  if (!rd.Is(rm) || !use_short_hand_form_) {
1893    os() << rd << ", ";
1894  }
1895  os() << rm << ", " << operand;
1896}
1897
1898void Disassembler::mla(
1899    Condition cond, Register rd, Register rn, Register rm, Register ra) {
1900  os().SetCurrentInstruction(kMla, kArithmetic);
1901  os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd
1902       << ", " << rn << ", " << rm << ", " << ra;
1903}
1904
1905void Disassembler::mlas(
1906    Condition cond, Register rd, Register rn, Register rm, Register ra) {
1907  os().SetCurrentInstruction(kMlas, kArithmetic);
1908  os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd
1909       << ", " << rn << ", " << rm << ", " << ra;
1910}
1911
1912void Disassembler::mls(
1913    Condition cond, Register rd, Register rn, Register rm, Register ra) {
1914  os().SetCurrentInstruction(kMls, kArithmetic);
1915  os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd
1916       << ", " << rn << ", " << rm << ", " << ra;
1917}
1918
1919void Disassembler::mov(Condition cond,
1920                       EncodingSize size,
1921                       Register rd,
1922                       const Operand& operand) {
1923  os().SetCurrentInstruction(kMov, kNoAttribute);
1924  os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " "
1925       << rd << ", " << operand;
1926}
1927
1928void Disassembler::movs(Condition cond,
1929                        EncodingSize size,
1930                        Register rd,
1931                        const Operand& operand) {
1932  os().SetCurrentInstruction(kMovs, kNoAttribute);
1933  os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " "
1934       << rd << ", " << operand;
1935}
1936
1937void Disassembler::movt(Condition cond, Register rd, const Operand& operand) {
1938  os().SetCurrentInstruction(kMovt, kNoAttribute);
1939  os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd
1940       << ", " << operand;
1941}
1942
1943void Disassembler::movw(Condition cond, Register rd, const Operand& operand) {
1944  os().SetCurrentInstruction(kMovw, kNoAttribute);
1945  os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd
1946       << ", " << operand;
1947}
1948
1949void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
1950  os().SetCurrentInstruction(kMrs, kNoAttribute);
1951  os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd
1952       << ", " << spec_reg;
1953}
1954
1955void Disassembler::msr(Condition cond,
1956                       MaskedSpecialRegister spec_reg,
1957                       const Operand& operand) {
1958  os().SetCurrentInstruction(kMsr, kNoAttribute);
1959  os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " "
1960       << spec_reg << ", " << operand;
1961}
1962
1963void Disassembler::mul(
1964    Condition cond, EncodingSize size, Register rd, Register rn, Register rm) {
1965  os().SetCurrentInstruction(kMul, kArithmetic);
1966  os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " "
1967       << rd << ", " << rn << ", " << rm;
1968}
1969
1970void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) {
1971  os().SetCurrentInstruction(kMuls, kArithmetic);
1972  os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd
1973       << ", " << rn << ", " << rm;
1974}
1975
1976void Disassembler::mvn(Condition cond,
1977                       EncodingSize size,
1978                       Register rd,
1979                       const Operand& operand) {
1980  os().SetCurrentInstruction(kMvn, kNoAttribute);
1981  os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " "
1982       << rd << ", " << operand;
1983}
1984
1985void Disassembler::mvns(Condition cond,
1986                        EncodingSize size,
1987                        Register rd,
1988                        const Operand& operand) {
1989  os().SetCurrentInstruction(kMvns, kNoAttribute);
1990  os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " "
1991       << rd << ", " << operand;
1992}
1993
1994void Disassembler::nop(Condition cond, EncodingSize size) {
1995  os().SetCurrentInstruction(kNop, kNoAttribute);
1996  os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size;
1997}
1998
1999void Disassembler::orn(Condition cond,
2000                       Register rd,
2001                       Register rn,
2002                       const Operand& operand) {
2003  os().SetCurrentInstruction(kOrn, kBitwise);
2004  os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond);
2005  os() << " ";
2006  if (!rd.Is(rn) || !use_short_hand_form_) {
2007    os() << rd << ", ";
2008  }
2009  os() << rn << ", " << operand;
2010}
2011
2012void Disassembler::orns(Condition cond,
2013                        Register rd,
2014                        Register rn,
2015                        const Operand& operand) {
2016  os().SetCurrentInstruction(kOrns, kBitwise);
2017  os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond);
2018  os() << " ";
2019  if (!rd.Is(rn) || !use_short_hand_form_) {
2020    os() << rd << ", ";
2021  }
2022  os() << rn << ", " << operand;
2023}
2024
2025void Disassembler::orr(Condition cond,
2026                       EncodingSize size,
2027                       Register rd,
2028                       Register rn,
2029                       const Operand& operand) {
2030  os().SetCurrentInstruction(kOrr, kBitwise);
2031  os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size;
2032  os() << " ";
2033  if (!rd.Is(rn) || !use_short_hand_form_) {
2034    os() << rd << ", ";
2035  }
2036  os() << rn << ", " << operand;
2037}
2038
2039void Disassembler::orrs(Condition cond,
2040                        EncodingSize size,
2041                        Register rd,
2042                        Register rn,
2043                        const Operand& operand) {
2044  os().SetCurrentInstruction(kOrrs, kBitwise);
2045  os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size;
2046  os() << " ";
2047  if (!rd.Is(rn) || !use_short_hand_form_) {
2048    os() << rd << ", ";
2049  }
2050  os() << rn << ", " << operand;
2051}
2052
2053void Disassembler::pkhbt(Condition cond,
2054                         Register rd,
2055                         Register rn,
2056                         const Operand& operand) {
2057  os().SetCurrentInstruction(kPkhbt, kNoAttribute);
2058  os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond);
2059  os() << " ";
2060  if (!rd.Is(rn) || !use_short_hand_form_) {
2061    os() << rd << ", ";
2062  }
2063  os() << rn << ", " << operand;
2064}
2065
2066void Disassembler::pkhtb(Condition cond,
2067                         Register rd,
2068                         Register rn,
2069                         const Operand& operand) {
2070  os().SetCurrentInstruction(kPkhtb, kNoAttribute);
2071  os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond);
2072  os() << " ";
2073  if (!rd.Is(rn) || !use_short_hand_form_) {
2074    os() << rd << ", ";
2075  }
2076  os() << rn << ", " << operand;
2077}
2078
2079void Disassembler::pld(Condition cond, Location* location) {
2080  os().SetCurrentInstruction(kPld, kAddress);
2081  os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
2082       << PrintLabel(kDataLocation, location, GetCodeAddress() & ~3);
2083}
2084
2085void Disassembler::pld(Condition cond, const MemOperand& operand) {
2086  os().SetCurrentInstruction(kPld, kAddress);
2087  os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
2088       << PrintMemOperand(kDataLocation, operand);
2089}
2090
2091void Disassembler::pldw(Condition cond, const MemOperand& operand) {
2092  os().SetCurrentInstruction(kPldw, kAddress);
2093  os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " "
2094       << PrintMemOperand(kDataLocation, operand);
2095}
2096
2097void Disassembler::pli(Condition cond, const MemOperand& operand) {
2098  os().SetCurrentInstruction(kPli, kAddress);
2099  os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
2100       << PrintMemOperand(kCodeLocation, operand);
2101}
2102
2103void Disassembler::pli(Condition cond, Location* location) {
2104  os().SetCurrentInstruction(kPli, kAddress);
2105  os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
2106       << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
2107}
2108
2109void Disassembler::pop(Condition cond,
2110                       EncodingSize size,
2111                       RegisterList registers) {
2112  os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
2113  os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
2114       << registers;
2115}
2116
2117void Disassembler::pop(Condition cond, EncodingSize size, Register rt) {
2118  os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
2119  os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
2120       << "{" << rt << "}";
2121}
2122
2123void Disassembler::push(Condition cond,
2124                        EncodingSize size,
2125                        RegisterList registers) {
2126  os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
2127  os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
2128       << registers;
2129}
2130
2131void Disassembler::push(Condition cond, EncodingSize size, Register rt) {
2132  os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
2133  os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
2134       << "{" << rt << "}";
2135}
2136
2137void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) {
2138  os().SetCurrentInstruction(kQadd, kArithmetic);
2139  os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond);
2140  os() << " ";
2141  if (!rd.Is(rm) || !use_short_hand_form_) {
2142    os() << rd << ", ";
2143  }
2144  os() << rm << ", " << rn;
2145}
2146
2147void Disassembler::qadd16(Condition cond,
2148                          Register rd,
2149                          Register rn,
2150                          Register rm) {
2151  os().SetCurrentInstruction(kQadd16, kArithmetic);
2152  os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond);
2153  os() << " ";
2154  if (!rd.Is(rn) || !use_short_hand_form_) {
2155    os() << rd << ", ";
2156  }
2157  os() << rn << ", " << rm;
2158}
2159
2160void Disassembler::qadd8(Condition cond,
2161                         Register rd,
2162                         Register rn,
2163                         Register rm) {
2164  os().SetCurrentInstruction(kQadd8, kArithmetic);
2165  os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond);
2166  os() << " ";
2167  if (!rd.Is(rn) || !use_short_hand_form_) {
2168    os() << rd << ", ";
2169  }
2170  os() << rn << ", " << rm;
2171}
2172
2173void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) {
2174  os().SetCurrentInstruction(kQasx, kArithmetic);
2175  os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond);
2176  os() << " ";
2177  if (!rd.Is(rn) || !use_short_hand_form_) {
2178    os() << rd << ", ";
2179  }
2180  os() << rn << ", " << rm;
2181}
2182
2183void Disassembler::qdadd(Condition cond,
2184                         Register rd,
2185                         Register rm,
2186                         Register rn) {
2187  os().SetCurrentInstruction(kQdadd, kArithmetic);
2188  os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond);
2189  os() << " ";
2190  if (!rd.Is(rm) || !use_short_hand_form_) {
2191    os() << rd << ", ";
2192  }
2193  os() << rm << ", " << rn;
2194}
2195
2196void Disassembler::qdsub(Condition cond,
2197                         Register rd,
2198                         Register rm,
2199                         Register rn) {
2200  os().SetCurrentInstruction(kQdsub, kArithmetic);
2201  os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond);
2202  os() << " ";
2203  if (!rd.Is(rm) || !use_short_hand_form_) {
2204    os() << rd << ", ";
2205  }
2206  os() << rm << ", " << rn;
2207}
2208
2209void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) {
2210  os().SetCurrentInstruction(kQsax, kArithmetic);
2211  os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond);
2212  os() << " ";
2213  if (!rd.Is(rn) || !use_short_hand_form_) {
2214    os() << rd << ", ";
2215  }
2216  os() << rn << ", " << rm;
2217}
2218
2219void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) {
2220  os().SetCurrentInstruction(kQsub, kArithmetic);
2221  os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond);
2222  os() << " ";
2223  if (!rd.Is(rm) || !use_short_hand_form_) {
2224    os() << rd << ", ";
2225  }
2226  os() << rm << ", " << rn;
2227}
2228
2229void Disassembler::qsub16(Condition cond,
2230                          Register rd,
2231                          Register rn,
2232                          Register rm) {
2233  os().SetCurrentInstruction(kQsub16, kArithmetic);
2234  os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond);
2235  os() << " ";
2236  if (!rd.Is(rn) || !use_short_hand_form_) {
2237    os() << rd << ", ";
2238  }
2239  os() << rn << ", " << rm;
2240}
2241
2242void Disassembler::qsub8(Condition cond,
2243                         Register rd,
2244                         Register rn,
2245                         Register rm) {
2246  os().SetCurrentInstruction(kQsub8, kArithmetic);
2247  os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond);
2248  os() << " ";
2249  if (!rd.Is(rn) || !use_short_hand_form_) {
2250    os() << rd << ", ";
2251  }
2252  os() << rn << ", " << rm;
2253}
2254
2255void Disassembler::rbit(Condition cond, Register rd, Register rm) {
2256  os().SetCurrentInstruction(kRbit, kNoAttribute);
2257  os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd
2258       << ", " << rm;
2259}
2260
2261void Disassembler::rev(Condition cond,
2262                       EncodingSize size,
2263                       Register rd,
2264                       Register rm) {
2265  os().SetCurrentInstruction(kRev, kNoAttribute);
2266  os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " "
2267       << rd << ", " << rm;
2268}
2269
2270void Disassembler::rev16(Condition cond,
2271                         EncodingSize size,
2272                         Register rd,
2273                         Register rm) {
2274  os().SetCurrentInstruction(kRev16, kNoAttribute);
2275  os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " "
2276       << rd << ", " << rm;
2277}
2278
2279void Disassembler::revsh(Condition cond,
2280                         EncodingSize size,
2281                         Register rd,
2282                         Register rm) {
2283  os().SetCurrentInstruction(kRevsh, kNoAttribute);
2284  os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " "
2285       << rd << ", " << rm;
2286}
2287
2288void Disassembler::ror(Condition cond,
2289                       EncodingSize size,
2290                       Register rd,
2291                       Register rm,
2292                       const Operand& operand) {
2293  os().SetCurrentInstruction(kRor, kShift);
2294  os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size;
2295  os() << " ";
2296  if (!rd.Is(rm) || !use_short_hand_form_) {
2297    os() << rd << ", ";
2298  }
2299  os() << rm << ", " << operand;
2300}
2301
2302void Disassembler::rors(Condition cond,
2303                        EncodingSize size,
2304                        Register rd,
2305                        Register rm,
2306                        const Operand& operand) {
2307  os().SetCurrentInstruction(kRors, kShift);
2308  os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size;
2309  os() << " ";
2310  if (!rd.Is(rm) || !use_short_hand_form_) {
2311    os() << rd << ", ";
2312  }
2313  os() << rm << ", " << operand;
2314}
2315
2316void Disassembler::rrx(Condition cond, Register rd, Register rm) {
2317  os().SetCurrentInstruction(kRrx, kShift);
2318  os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond);
2319  os() << " ";
2320  if (!rd.Is(rm) || !use_short_hand_form_) {
2321    os() << rd << ", ";
2322  }
2323  os() << rm;
2324}
2325
2326void Disassembler::rrxs(Condition cond, Register rd, Register rm) {
2327  os().SetCurrentInstruction(kRrxs, kShift);
2328  os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond);
2329  os() << " ";
2330  if (!rd.Is(rm) || !use_short_hand_form_) {
2331    os() << rd << ", ";
2332  }
2333  os() << rm;
2334}
2335
2336void Disassembler::rsb(Condition cond,
2337                       EncodingSize size,
2338                       Register rd,
2339                       Register rn,
2340                       const Operand& operand) {
2341  os().SetCurrentInstruction(kRsb, kArithmetic);
2342  os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size;
2343  os() << " ";
2344  if (!rd.Is(rn) || !use_short_hand_form_) {
2345    os() << rd << ", ";
2346  }
2347  os() << rn << ", " << operand;
2348}
2349
2350void Disassembler::rsbs(Condition cond,
2351                        EncodingSize size,
2352                        Register rd,
2353                        Register rn,
2354                        const Operand& operand) {
2355  os().SetCurrentInstruction(kRsbs, kArithmetic);
2356  os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size;
2357  os() << " ";
2358  if (!rd.Is(rn) || !use_short_hand_form_) {
2359    os() << rd << ", ";
2360  }
2361  os() << rn << ", " << operand;
2362}
2363
2364void Disassembler::rsc(Condition cond,
2365                       Register rd,
2366                       Register rn,
2367                       const Operand& operand) {
2368  os().SetCurrentInstruction(kRsc, kArithmetic);
2369  os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond);
2370  os() << " ";
2371  if (!rd.Is(rn) || !use_short_hand_form_) {
2372    os() << rd << ", ";
2373  }
2374  os() << rn << ", " << operand;
2375}
2376
2377void Disassembler::rscs(Condition cond,
2378                        Register rd,
2379                        Register rn,
2380                        const Operand& operand) {
2381  os().SetCurrentInstruction(kRscs, kArithmetic);
2382  os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond);
2383  os() << " ";
2384  if (!rd.Is(rn) || !use_short_hand_form_) {
2385    os() << rd << ", ";
2386  }
2387  os() << rn << ", " << operand;
2388}
2389
2390void Disassembler::sadd16(Condition cond,
2391                          Register rd,
2392                          Register rn,
2393                          Register rm) {
2394  os().SetCurrentInstruction(kSadd16, kArithmetic);
2395  os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond);
2396  os() << " ";
2397  if (!rd.Is(rn) || !use_short_hand_form_) {
2398    os() << rd << ", ";
2399  }
2400  os() << rn << ", " << rm;
2401}
2402
2403void Disassembler::sadd8(Condition cond,
2404                         Register rd,
2405                         Register rn,
2406                         Register rm) {
2407  os().SetCurrentInstruction(kSadd8, kArithmetic);
2408  os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond);
2409  os() << " ";
2410  if (!rd.Is(rn) || !use_short_hand_form_) {
2411    os() << rd << ", ";
2412  }
2413  os() << rn << ", " << rm;
2414}
2415
2416void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) {
2417  os().SetCurrentInstruction(kSasx, kArithmetic);
2418  os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond);
2419  os() << " ";
2420  if (!rd.Is(rn) || !use_short_hand_form_) {
2421    os() << rd << ", ";
2422  }
2423  os() << rn << ", " << rm;
2424}
2425
2426void Disassembler::sbc(Condition cond,
2427                       EncodingSize size,
2428                       Register rd,
2429                       Register rn,
2430                       const Operand& operand) {
2431  os().SetCurrentInstruction(kSbc, kArithmetic);
2432  os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size;
2433  os() << " ";
2434  if (!rd.Is(rn) || !use_short_hand_form_) {
2435    os() << rd << ", ";
2436  }
2437  os() << rn << ", " << operand;
2438}
2439
2440void Disassembler::sbcs(Condition cond,
2441                        EncodingSize size,
2442                        Register rd,
2443                        Register rn,
2444                        const Operand& operand) {
2445  os().SetCurrentInstruction(kSbcs, kArithmetic);
2446  os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size;
2447  os() << " ";
2448  if (!rd.Is(rn) || !use_short_hand_form_) {
2449    os() << rd << ", ";
2450  }
2451  os() << rn << ", " << operand;
2452}
2453
2454void Disassembler::sbfx(
2455    Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
2456  os().SetCurrentInstruction(kSbfx, kShift);
2457  os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd
2458       << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
2459       << ImmediatePrinter(width);
2460}
2461
2462void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) {
2463  os().SetCurrentInstruction(kSdiv, kArithmetic);
2464  os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond);
2465  os() << " ";
2466  if (!rd.Is(rn) || !use_short_hand_form_) {
2467    os() << rd << ", ";
2468  }
2469  os() << rn << ", " << rm;
2470}
2471
2472void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) {
2473  os().SetCurrentInstruction(kSel, kNoAttribute);
2474  os() << ToCString(kSel) << ConditionPrinter(it_block_, cond);
2475  os() << " ";
2476  if (!rd.Is(rn) || !use_short_hand_form_) {
2477    os() << rd << ", ";
2478  }
2479  os() << rn << ", " << rm;
2480}
2481
2482void Disassembler::shadd16(Condition cond,
2483                           Register rd,
2484                           Register rn,
2485                           Register rm) {
2486  os().SetCurrentInstruction(kShadd16, kArithmetic);
2487  os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond);
2488  os() << " ";
2489  if (!rd.Is(rn) || !use_short_hand_form_) {
2490    os() << rd << ", ";
2491  }
2492  os() << rn << ", " << rm;
2493}
2494
2495void Disassembler::shadd8(Condition cond,
2496                          Register rd,
2497                          Register rn,
2498                          Register rm) {
2499  os().SetCurrentInstruction(kShadd8, kArithmetic);
2500  os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond);
2501  os() << " ";
2502  if (!rd.Is(rn) || !use_short_hand_form_) {
2503    os() << rd << ", ";
2504  }
2505  os() << rn << ", " << rm;
2506}
2507
2508void Disassembler::shasx(Condition cond,
2509                         Register rd,
2510                         Register rn,
2511                         Register rm) {
2512  os().SetCurrentInstruction(kShasx, kArithmetic);
2513  os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond);
2514  os() << " ";
2515  if (!rd.Is(rn) || !use_short_hand_form_) {
2516    os() << rd << ", ";
2517  }
2518  os() << rn << ", " << rm;
2519}
2520
2521void Disassembler::shsax(Condition cond,
2522                         Register rd,
2523                         Register rn,
2524                         Register rm) {
2525  os().SetCurrentInstruction(kShsax, kArithmetic);
2526  os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond);
2527  os() << " ";
2528  if (!rd.Is(rn) || !use_short_hand_form_) {
2529    os() << rd << ", ";
2530  }
2531  os() << rn << ", " << rm;
2532}
2533
2534void Disassembler::shsub16(Condition cond,
2535                           Register rd,
2536                           Register rn,
2537                           Register rm) {
2538  os().SetCurrentInstruction(kShsub16, kArithmetic);
2539  os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond);
2540  os() << " ";
2541  if (!rd.Is(rn) || !use_short_hand_form_) {
2542    os() << rd << ", ";
2543  }
2544  os() << rn << ", " << rm;
2545}
2546
2547void Disassembler::shsub8(Condition cond,
2548                          Register rd,
2549                          Register rn,
2550                          Register rm) {
2551  os().SetCurrentInstruction(kShsub8, kArithmetic);
2552  os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond);
2553  os() << " ";
2554  if (!rd.Is(rn) || !use_short_hand_form_) {
2555    os() << rd << ", ";
2556  }
2557  os() << rn << ", " << rm;
2558}
2559
2560void Disassembler::smlabb(
2561    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2562  os().SetCurrentInstruction(kSmlabb, kArithmetic);
2563  os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd
2564       << ", " << rn << ", " << rm << ", " << ra;
2565}
2566
2567void Disassembler::smlabt(
2568    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2569  os().SetCurrentInstruction(kSmlabt, kArithmetic);
2570  os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd
2571       << ", " << rn << ", " << rm << ", " << ra;
2572}
2573
2574void Disassembler::smlad(
2575    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2576  os().SetCurrentInstruction(kSmlad, kArithmetic);
2577  os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd
2578       << ", " << rn << ", " << rm << ", " << ra;
2579}
2580
2581void Disassembler::smladx(
2582    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2583  os().SetCurrentInstruction(kSmladx, kArithmetic);
2584  os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd
2585       << ", " << rn << ", " << rm << ", " << ra;
2586}
2587
2588void Disassembler::smlal(
2589    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2590  os().SetCurrentInstruction(kSmlal, kArithmetic);
2591  os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
2592       << ", " << rdhi << ", " << rn << ", " << rm;
2593}
2594
2595void Disassembler::smlalbb(
2596    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2597  os().SetCurrentInstruction(kSmlalbb, kArithmetic);
2598  os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " "
2599       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2600}
2601
2602void Disassembler::smlalbt(
2603    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2604  os().SetCurrentInstruction(kSmlalbt, kArithmetic);
2605  os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " "
2606       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2607}
2608
2609void Disassembler::smlald(
2610    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2611  os().SetCurrentInstruction(kSmlald, kArithmetic);
2612  os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo
2613       << ", " << rdhi << ", " << rn << ", " << rm;
2614}
2615
2616void Disassembler::smlaldx(
2617    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2618  os().SetCurrentInstruction(kSmlaldx, kArithmetic);
2619  os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " "
2620       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2621}
2622
2623void Disassembler::smlals(
2624    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2625  os().SetCurrentInstruction(kSmlals, kArithmetic);
2626  os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
2627       << ", " << rdhi << ", " << rn << ", " << rm;
2628}
2629
2630void Disassembler::smlaltb(
2631    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2632  os().SetCurrentInstruction(kSmlaltb, kArithmetic);
2633  os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " "
2634       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2635}
2636
2637void Disassembler::smlaltt(
2638    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2639  os().SetCurrentInstruction(kSmlaltt, kArithmetic);
2640  os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " "
2641       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2642}
2643
2644void Disassembler::smlatb(
2645    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2646  os().SetCurrentInstruction(kSmlatb, kArithmetic);
2647  os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd
2648       << ", " << rn << ", " << rm << ", " << ra;
2649}
2650
2651void Disassembler::smlatt(
2652    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2653  os().SetCurrentInstruction(kSmlatt, kArithmetic);
2654  os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd
2655       << ", " << rn << ", " << rm << ", " << ra;
2656}
2657
2658void Disassembler::smlawb(
2659    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2660  os().SetCurrentInstruction(kSmlawb, kArithmetic);
2661  os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd
2662       << ", " << rn << ", " << rm << ", " << ra;
2663}
2664
2665void Disassembler::smlawt(
2666    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2667  os().SetCurrentInstruction(kSmlawt, kArithmetic);
2668  os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd
2669       << ", " << rn << ", " << rm << ", " << ra;
2670}
2671
2672void Disassembler::smlsd(
2673    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2674  os().SetCurrentInstruction(kSmlsd, kArithmetic);
2675  os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd
2676       << ", " << rn << ", " << rm << ", " << ra;
2677}
2678
2679void Disassembler::smlsdx(
2680    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2681  os().SetCurrentInstruction(kSmlsdx, kArithmetic);
2682  os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd
2683       << ", " << rn << ", " << rm << ", " << ra;
2684}
2685
2686void Disassembler::smlsld(
2687    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2688  os().SetCurrentInstruction(kSmlsld, kArithmetic);
2689  os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo
2690       << ", " << rdhi << ", " << rn << ", " << rm;
2691}
2692
2693void Disassembler::smlsldx(
2694    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2695  os().SetCurrentInstruction(kSmlsldx, kArithmetic);
2696  os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " "
2697       << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2698}
2699
2700void Disassembler::smmla(
2701    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2702  os().SetCurrentInstruction(kSmmla, kArithmetic);
2703  os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd
2704       << ", " << rn << ", " << rm << ", " << ra;
2705}
2706
2707void Disassembler::smmlar(
2708    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2709  os().SetCurrentInstruction(kSmmlar, kArithmetic);
2710  os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd
2711       << ", " << rn << ", " << rm << ", " << ra;
2712}
2713
2714void Disassembler::smmls(
2715    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2716  os().SetCurrentInstruction(kSmmls, kArithmetic);
2717  os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd
2718       << ", " << rn << ", " << rm << ", " << ra;
2719}
2720
2721void Disassembler::smmlsr(
2722    Condition cond, Register rd, Register rn, Register rm, Register ra) {
2723  os().SetCurrentInstruction(kSmmlsr, kArithmetic);
2724  os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd
2725       << ", " << rn << ", " << rm << ", " << ra;
2726}
2727
2728void Disassembler::smmul(Condition cond,
2729                         Register rd,
2730                         Register rn,
2731                         Register rm) {
2732  os().SetCurrentInstruction(kSmmul, kArithmetic);
2733  os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond);
2734  os() << " ";
2735  if (!rd.Is(rn) || !use_short_hand_form_) {
2736    os() << rd << ", ";
2737  }
2738  os() << rn << ", " << rm;
2739}
2740
2741void Disassembler::smmulr(Condition cond,
2742                          Register rd,
2743                          Register rn,
2744                          Register rm) {
2745  os().SetCurrentInstruction(kSmmulr, kArithmetic);
2746  os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond);
2747  os() << " ";
2748  if (!rd.Is(rn) || !use_short_hand_form_) {
2749    os() << rd << ", ";
2750  }
2751  os() << rn << ", " << rm;
2752}
2753
2754void Disassembler::smuad(Condition cond,
2755                         Register rd,
2756                         Register rn,
2757                         Register rm) {
2758  os().SetCurrentInstruction(kSmuad, kArithmetic);
2759  os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond);
2760  os() << " ";
2761  if (!rd.Is(rn) || !use_short_hand_form_) {
2762    os() << rd << ", ";
2763  }
2764  os() << rn << ", " << rm;
2765}
2766
2767void Disassembler::smuadx(Condition cond,
2768                          Register rd,
2769                          Register rn,
2770                          Register rm) {
2771  os().SetCurrentInstruction(kSmuadx, kArithmetic);
2772  os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond);
2773  os() << " ";
2774  if (!rd.Is(rn) || !use_short_hand_form_) {
2775    os() << rd << ", ";
2776  }
2777  os() << rn << ", " << rm;
2778}
2779
2780void Disassembler::smulbb(Condition cond,
2781                          Register rd,
2782                          Register rn,
2783                          Register rm) {
2784  os().SetCurrentInstruction(kSmulbb, kArithmetic);
2785  os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond);
2786  os() << " ";
2787  if (!rd.Is(rn) || !use_short_hand_form_) {
2788    os() << rd << ", ";
2789  }
2790  os() << rn << ", " << rm;
2791}
2792
2793void Disassembler::smulbt(Condition cond,
2794                          Register rd,
2795                          Register rn,
2796                          Register rm) {
2797  os().SetCurrentInstruction(kSmulbt, kArithmetic);
2798  os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond);
2799  os() << " ";
2800  if (!rd.Is(rn) || !use_short_hand_form_) {
2801    os() << rd << ", ";
2802  }
2803  os() << rn << ", " << rm;
2804}
2805
2806void Disassembler::smull(
2807    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2808  os().SetCurrentInstruction(kSmull, kArithmetic);
2809  os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
2810       << ", " << rdhi << ", " << rn << ", " << rm;
2811}
2812
2813void Disassembler::smulls(
2814    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2815  os().SetCurrentInstruction(kSmulls, kArithmetic);
2816  os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
2817       << ", " << rdhi << ", " << rn << ", " << rm;
2818}
2819
2820void Disassembler::smultb(Condition cond,
2821                          Register rd,
2822                          Register rn,
2823                          Register rm) {
2824  os().SetCurrentInstruction(kSmultb, kArithmetic);
2825  os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond);
2826  os() << " ";
2827  if (!rd.Is(rn) || !use_short_hand_form_) {
2828    os() << rd << ", ";
2829  }
2830  os() << rn << ", " << rm;
2831}
2832
2833void Disassembler::smultt(Condition cond,
2834                          Register rd,
2835                          Register rn,
2836                          Register rm) {
2837  os().SetCurrentInstruction(kSmultt, kArithmetic);
2838  os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond);
2839  os() << " ";
2840  if (!rd.Is(rn) || !use_short_hand_form_) {
2841    os() << rd << ", ";
2842  }
2843  os() << rn << ", " << rm;
2844}
2845
2846void Disassembler::smulwb(Condition cond,
2847                          Register rd,
2848                          Register rn,
2849                          Register rm) {
2850  os().SetCurrentInstruction(kSmulwb, kArithmetic);
2851  os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond);
2852  os() << " ";
2853  if (!rd.Is(rn) || !use_short_hand_form_) {
2854    os() << rd << ", ";
2855  }
2856  os() << rn << ", " << rm;
2857}
2858
2859void Disassembler::smulwt(Condition cond,
2860                          Register rd,
2861                          Register rn,
2862                          Register rm) {
2863  os().SetCurrentInstruction(kSmulwt, kArithmetic);
2864  os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond);
2865  os() << " ";
2866  if (!rd.Is(rn) || !use_short_hand_form_) {
2867    os() << rd << ", ";
2868  }
2869  os() << rn << ", " << rm;
2870}
2871
2872void Disassembler::smusd(Condition cond,
2873                         Register rd,
2874                         Register rn,
2875                         Register rm) {
2876  os().SetCurrentInstruction(kSmusd, kArithmetic);
2877  os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond);
2878  os() << " ";
2879  if (!rd.Is(rn) || !use_short_hand_form_) {
2880    os() << rd << ", ";
2881  }
2882  os() << rn << ", " << rm;
2883}
2884
2885void Disassembler::smusdx(Condition cond,
2886                          Register rd,
2887                          Register rn,
2888                          Register rm) {
2889  os().SetCurrentInstruction(kSmusdx, kArithmetic);
2890  os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond);
2891  os() << " ";
2892  if (!rd.Is(rn) || !use_short_hand_form_) {
2893    os() << rd << ", ";
2894  }
2895  os() << rn << ", " << rm;
2896}
2897
2898void Disassembler::ssat(Condition cond,
2899                        Register rd,
2900                        uint32_t imm,
2901                        const Operand& operand) {
2902  os().SetCurrentInstruction(kSsat, kArithmetic);
2903  os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd
2904       << ", " << ImmediatePrinter(imm) << ", " << operand;
2905}
2906
2907void Disassembler::ssat16(Condition cond,
2908                          Register rd,
2909                          uint32_t imm,
2910                          Register rn) {
2911  os().SetCurrentInstruction(kSsat16, kArithmetic);
2912  os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd
2913       << ", " << ImmediatePrinter(imm) << ", " << rn;
2914}
2915
2916void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) {
2917  os().SetCurrentInstruction(kSsax, kArithmetic);
2918  os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond);
2919  os() << " ";
2920  if (!rd.Is(rn) || !use_short_hand_form_) {
2921    os() << rd << ", ";
2922  }
2923  os() << rn << ", " << rm;
2924}
2925
2926void Disassembler::ssub16(Condition cond,
2927                          Register rd,
2928                          Register rn,
2929                          Register rm) {
2930  os().SetCurrentInstruction(kSsub16, kArithmetic);
2931  os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond);
2932  os() << " ";
2933  if (!rd.Is(rn) || !use_short_hand_form_) {
2934    os() << rd << ", ";
2935  }
2936  os() << rn << ", " << rm;
2937}
2938
2939void Disassembler::ssub8(Condition cond,
2940                         Register rd,
2941                         Register rn,
2942                         Register rm) {
2943  os().SetCurrentInstruction(kSsub8, kArithmetic);
2944  os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond);
2945  os() << " ";
2946  if (!rd.Is(rn) || !use_short_hand_form_) {
2947    os() << rd << ", ";
2948  }
2949  os() << rn << ", " << rm;
2950}
2951
2952void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) {
2953  os().SetCurrentInstruction(kStl, kAddress | kLoadStore);
2954  os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt
2955       << ", " << PrintMemOperand(kStoreWordLocation, operand);
2956}
2957
2958void Disassembler::stlb(Condition cond,
2959                        Register rt,
2960                        const MemOperand& operand) {
2961  os().SetCurrentInstruction(kStlb, kAddress | kLoadStore);
2962  os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt
2963       << ", " << PrintMemOperand(kStoreByteLocation, operand);
2964}
2965
2966void Disassembler::stlex(Condition cond,
2967                         Register rd,
2968                         Register rt,
2969                         const MemOperand& operand) {
2970  os().SetCurrentInstruction(kStlex, kAddress | kLoadStore);
2971  os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd
2972       << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
2973}
2974
2975void Disassembler::stlexb(Condition cond,
2976                          Register rd,
2977                          Register rt,
2978                          const MemOperand& operand) {
2979  os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore);
2980  os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd
2981       << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
2982}
2983
2984void Disassembler::stlexd(Condition cond,
2985                          Register rd,
2986                          Register rt,
2987                          Register rt2,
2988                          const MemOperand& operand) {
2989  os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore);
2990  os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd
2991       << ", " << rt << ", " << rt2 << ", "
2992       << PrintMemOperand(kStoreDoubleWordLocation, operand);
2993}
2994
2995void Disassembler::stlexh(Condition cond,
2996                          Register rd,
2997                          Register rt,
2998                          const MemOperand& operand) {
2999  os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore);
3000  os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd
3001       << ", " << rt << ", "
3002       << PrintMemOperand(kStoreHalfWordLocation, operand);
3003}
3004
3005void Disassembler::stlh(Condition cond,
3006                        Register rt,
3007                        const MemOperand& operand) {
3008  os().SetCurrentInstruction(kStlh, kAddress | kLoadStore);
3009  os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt
3010       << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
3011}
3012
3013void Disassembler::stm(Condition cond,
3014                       EncodingSize size,
3015                       Register rn,
3016                       WriteBack write_back,
3017                       RegisterList registers) {
3018  os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple);
3019  os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " "
3020       << rn << write_back << ", " << registers;
3021}
3022
3023void Disassembler::stmda(Condition cond,
3024                         Register rn,
3025                         WriteBack write_back,
3026                         RegisterList registers) {
3027  os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple);
3028  os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn
3029       << write_back << ", " << registers;
3030}
3031
3032void Disassembler::stmdb(Condition cond,
3033                         EncodingSize size,
3034                         Register rn,
3035                         WriteBack write_back,
3036                         RegisterList registers) {
3037  os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple);
3038  os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " "
3039       << rn << write_back << ", " << registers;
3040}
3041
3042void Disassembler::stmea(Condition cond,
3043                         EncodingSize size,
3044                         Register rn,
3045                         WriteBack write_back,
3046                         RegisterList registers) {
3047  os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple);
3048  os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " "
3049       << rn << write_back << ", " << registers;
3050}
3051
3052void Disassembler::stmed(Condition cond,
3053                         Register rn,
3054                         WriteBack write_back,
3055                         RegisterList registers) {
3056  os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple);
3057  os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn
3058       << write_back << ", " << registers;
3059}
3060
3061void Disassembler::stmfa(Condition cond,
3062                         Register rn,
3063                         WriteBack write_back,
3064                         RegisterList registers) {
3065  os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple);
3066  os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn
3067       << write_back << ", " << registers;
3068}
3069
3070void Disassembler::stmfd(Condition cond,
3071                         Register rn,
3072                         WriteBack write_back,
3073                         RegisterList registers) {
3074  os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple);
3075  os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn
3076       << write_back << ", " << registers;
3077}
3078
3079void Disassembler::stmib(Condition cond,
3080                         Register rn,
3081                         WriteBack write_back,
3082                         RegisterList registers) {
3083  os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple);
3084  os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn
3085       << write_back << ", " << registers;
3086}
3087
3088void Disassembler::str(Condition cond,
3089                       EncodingSize size,
3090                       Register rt,
3091                       const MemOperand& operand) {
3092  os().SetCurrentInstruction(kStr, kAddress | kLoadStore);
3093  os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " "
3094       << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
3095}
3096
3097void Disassembler::strb(Condition cond,
3098                        EncodingSize size,
3099                        Register rt,
3100                        const MemOperand& operand) {
3101  os().SetCurrentInstruction(kStrb, kAddress | kLoadStore);
3102  os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " "
3103       << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
3104}
3105
3106void Disassembler::strd(Condition cond,
3107                        Register rt,
3108                        Register rt2,
3109                        const MemOperand& operand) {
3110  os().SetCurrentInstruction(kStrd, kAddress | kLoadStore);
3111  os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt
3112       << ", " << rt2 << ", "
3113       << PrintMemOperand(kStoreDoubleWordLocation, operand);
3114}
3115
3116void Disassembler::strex(Condition cond,
3117                         Register rd,
3118                         Register rt,
3119                         const MemOperand& operand) {
3120  os().SetCurrentInstruction(kStrex, kAddress | kLoadStore);
3121  os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd
3122       << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
3123}
3124
3125void Disassembler::strexb(Condition cond,
3126                          Register rd,
3127                          Register rt,
3128                          const MemOperand& operand) {
3129  os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore);
3130  os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd
3131       << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
3132}
3133
3134void Disassembler::strexd(Condition cond,
3135                          Register rd,
3136                          Register rt,
3137                          Register rt2,
3138                          const MemOperand& operand) {
3139  os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore);
3140  os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd
3141       << ", " << rt << ", " << rt2 << ", "
3142       << PrintMemOperand(kStoreDoubleWordLocation, operand);
3143}
3144
3145void Disassembler::strexh(Condition cond,
3146                          Register rd,
3147                          Register rt,
3148                          const MemOperand& operand) {
3149  os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore);
3150  os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd
3151       << ", " << rt << ", "
3152       << PrintMemOperand(kStoreHalfWordLocation, operand);
3153}
3154
3155void Disassembler::strh(Condition cond,
3156                        EncodingSize size,
3157                        Register rt,
3158                        const MemOperand& operand) {
3159  os().SetCurrentInstruction(kStrh, kAddress | kLoadStore);
3160  os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " "
3161       << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
3162}
3163
3164void Disassembler::sub(Condition cond,
3165                       EncodingSize size,
3166                       Register rd,
3167                       Register rn,
3168                       const Operand& operand) {
3169  os().SetCurrentInstruction(kSub, kArithmetic);
3170  os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size;
3171  os() << " ";
3172  if (!rd.Is(rn) || !use_short_hand_form_) {
3173    os() << rd << ", ";
3174  }
3175  os() << rn << ", " << operand;
3176}
3177
3178void Disassembler::sub(Condition cond, Register rd, const Operand& operand) {
3179  os().SetCurrentInstruction(kSub, kArithmetic);
3180  os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd
3181       << ", " << operand;
3182}
3183
3184void Disassembler::subs(Condition cond,
3185                        EncodingSize size,
3186                        Register rd,
3187                        Register rn,
3188                        const Operand& operand) {
3189  os().SetCurrentInstruction(kSubs, kArithmetic);
3190  os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size;
3191  os() << " ";
3192  if (!rd.Is(rn) || !use_short_hand_form_) {
3193    os() << rd << ", ";
3194  }
3195  os() << rn << ", " << operand;
3196}
3197
3198void Disassembler::subs(Register rd, const Operand& operand) {
3199  os().SetCurrentInstruction(kSubs, kArithmetic);
3200  os() << ToCString(kSubs) << " " << rd << ", " << operand;
3201}
3202
3203void Disassembler::subw(Condition cond,
3204                        Register rd,
3205                        Register rn,
3206                        const Operand& operand) {
3207  os().SetCurrentInstruction(kSubw, kArithmetic);
3208  os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond);
3209  os() << " ";
3210  if (!rd.Is(rn) || !use_short_hand_form_) {
3211    os() << rd << ", ";
3212  }
3213  os() << rn << ", " << operand;
3214}
3215
3216void Disassembler::svc(Condition cond, uint32_t imm) {
3217  os().SetCurrentInstruction(kSvc, kSystem);
3218  os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " "
3219       << RawImmediatePrinter(imm);
3220}
3221
3222void Disassembler::sxtab(Condition cond,
3223                         Register rd,
3224                         Register rn,
3225                         const Operand& operand) {
3226  os().SetCurrentInstruction(kSxtab, kArithmetic);
3227  os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond);
3228  os() << " ";
3229  if (!rd.Is(rn) || !use_short_hand_form_) {
3230    os() << rd << ", ";
3231  }
3232  os() << rn << ", " << operand;
3233}
3234
3235void Disassembler::sxtab16(Condition cond,
3236                           Register rd,
3237                           Register rn,
3238                           const Operand& operand) {
3239  os().SetCurrentInstruction(kSxtab16, kArithmetic);
3240  os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond);
3241  os() << " ";
3242  if (!rd.Is(rn) || !use_short_hand_form_) {
3243    os() << rd << ", ";
3244  }
3245  os() << rn << ", " << operand;
3246}
3247
3248void Disassembler::sxtah(Condition cond,
3249                         Register rd,
3250                         Register rn,
3251                         const Operand& operand) {
3252  os().SetCurrentInstruction(kSxtah, kArithmetic);
3253  os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond);
3254  os() << " ";
3255  if (!rd.Is(rn) || !use_short_hand_form_) {
3256    os() << rd << ", ";
3257  }
3258  os() << rn << ", " << operand;
3259}
3260
3261void Disassembler::sxtb(Condition cond,
3262                        EncodingSize size,
3263                        Register rd,
3264                        const Operand& operand) {
3265  os().SetCurrentInstruction(kSxtb, kArithmetic);
3266  os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size;
3267  os() << " ";
3268  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3269    os() << rd << ", ";
3270  }
3271  os() << operand;
3272}
3273
3274void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) {
3275  os().SetCurrentInstruction(kSxtb16, kArithmetic);
3276  os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond);
3277  os() << " ";
3278  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3279    os() << rd << ", ";
3280  }
3281  os() << operand;
3282}
3283
3284void Disassembler::sxth(Condition cond,
3285                        EncodingSize size,
3286                        Register rd,
3287                        const Operand& operand) {
3288  os().SetCurrentInstruction(kSxth, kArithmetic);
3289  os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size;
3290  os() << " ";
3291  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3292    os() << rd << ", ";
3293  }
3294  os() << operand;
3295}
3296
3297void Disassembler::tbb(Condition cond, Register rn, Register rm) {
3298  os().SetCurrentInstruction(kTbb, kBranch);
3299  os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " "
3300       << MemOperand(rn, rm);
3301}
3302
3303void Disassembler::tbh(Condition cond, Register rn, Register rm) {
3304  os().SetCurrentInstruction(kTbh, kBranch);
3305  os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " "
3306       << MemOperand(rn, plus, rm, LSL, 1);
3307}
3308
3309void Disassembler::teq(Condition cond, Register rn, const Operand& operand) {
3310  os().SetCurrentInstruction(kTeq, kBitwise);
3311  os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn
3312       << ", " << operand;
3313}
3314
3315void Disassembler::tst(Condition cond,
3316                       EncodingSize size,
3317                       Register rn,
3318                       const Operand& operand) {
3319  os().SetCurrentInstruction(kTst, kBitwise);
3320  os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " "
3321       << rn << ", " << operand;
3322}
3323
3324void Disassembler::uadd16(Condition cond,
3325                          Register rd,
3326                          Register rn,
3327                          Register rm) {
3328  os().SetCurrentInstruction(kUadd16, kArithmetic);
3329  os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond);
3330  os() << " ";
3331  if (!rd.Is(rn) || !use_short_hand_form_) {
3332    os() << rd << ", ";
3333  }
3334  os() << rn << ", " << rm;
3335}
3336
3337void Disassembler::uadd8(Condition cond,
3338                         Register rd,
3339                         Register rn,
3340                         Register rm) {
3341  os().SetCurrentInstruction(kUadd8, kArithmetic);
3342  os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond);
3343  os() << " ";
3344  if (!rd.Is(rn) || !use_short_hand_form_) {
3345    os() << rd << ", ";
3346  }
3347  os() << rn << ", " << rm;
3348}
3349
3350void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) {
3351  os().SetCurrentInstruction(kUasx, kArithmetic);
3352  os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond);
3353  os() << " ";
3354  if (!rd.Is(rn) || !use_short_hand_form_) {
3355    os() << rd << ", ";
3356  }
3357  os() << rn << ", " << rm;
3358}
3359
3360void Disassembler::ubfx(
3361    Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
3362  os().SetCurrentInstruction(kUbfx, kShift);
3363  os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd
3364       << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
3365       << ImmediatePrinter(width);
3366}
3367
3368void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) {
3369  os().SetCurrentInstruction(kUdf, kNoAttribute);
3370  os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " "
3371       << RawImmediatePrinter(imm);
3372}
3373
3374void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) {
3375  os().SetCurrentInstruction(kUdiv, kArithmetic);
3376  os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond);
3377  os() << " ";
3378  if (!rd.Is(rn) || !use_short_hand_form_) {
3379    os() << rd << ", ";
3380  }
3381  os() << rn << ", " << rm;
3382}
3383
3384void Disassembler::uhadd16(Condition cond,
3385                           Register rd,
3386                           Register rn,
3387                           Register rm) {
3388  os().SetCurrentInstruction(kUhadd16, kArithmetic);
3389  os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond);
3390  os() << " ";
3391  if (!rd.Is(rn) || !use_short_hand_form_) {
3392    os() << rd << ", ";
3393  }
3394  os() << rn << ", " << rm;
3395}
3396
3397void Disassembler::uhadd8(Condition cond,
3398                          Register rd,
3399                          Register rn,
3400                          Register rm) {
3401  os().SetCurrentInstruction(kUhadd8, kArithmetic);
3402  os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond);
3403  os() << " ";
3404  if (!rd.Is(rn) || !use_short_hand_form_) {
3405    os() << rd << ", ";
3406  }
3407  os() << rn << ", " << rm;
3408}
3409
3410void Disassembler::uhasx(Condition cond,
3411                         Register rd,
3412                         Register rn,
3413                         Register rm) {
3414  os().SetCurrentInstruction(kUhasx, kArithmetic);
3415  os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond);
3416  os() << " ";
3417  if (!rd.Is(rn) || !use_short_hand_form_) {
3418    os() << rd << ", ";
3419  }
3420  os() << rn << ", " << rm;
3421}
3422
3423void Disassembler::uhsax(Condition cond,
3424                         Register rd,
3425                         Register rn,
3426                         Register rm) {
3427  os().SetCurrentInstruction(kUhsax, kArithmetic);
3428  os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond);
3429  os() << " ";
3430  if (!rd.Is(rn) || !use_short_hand_form_) {
3431    os() << rd << ", ";
3432  }
3433  os() << rn << ", " << rm;
3434}
3435
3436void Disassembler::uhsub16(Condition cond,
3437                           Register rd,
3438                           Register rn,
3439                           Register rm) {
3440  os().SetCurrentInstruction(kUhsub16, kArithmetic);
3441  os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond);
3442  os() << " ";
3443  if (!rd.Is(rn) || !use_short_hand_form_) {
3444    os() << rd << ", ";
3445  }
3446  os() << rn << ", " << rm;
3447}
3448
3449void Disassembler::uhsub8(Condition cond,
3450                          Register rd,
3451                          Register rn,
3452                          Register rm) {
3453  os().SetCurrentInstruction(kUhsub8, kArithmetic);
3454  os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond);
3455  os() << " ";
3456  if (!rd.Is(rn) || !use_short_hand_form_) {
3457    os() << rd << ", ";
3458  }
3459  os() << rn << ", " << rm;
3460}
3461
3462void Disassembler::umaal(
3463    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3464  os().SetCurrentInstruction(kUmaal, kArithmetic);
3465  os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo
3466       << ", " << rdhi << ", " << rn << ", " << rm;
3467}
3468
3469void Disassembler::umlal(
3470    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3471  os().SetCurrentInstruction(kUmlal, kArithmetic);
3472  os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
3473       << ", " << rdhi << ", " << rn << ", " << rm;
3474}
3475
3476void Disassembler::umlals(
3477    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3478  os().SetCurrentInstruction(kUmlals, kArithmetic);
3479  os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
3480       << ", " << rdhi << ", " << rn << ", " << rm;
3481}
3482
3483void Disassembler::umull(
3484    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3485  os().SetCurrentInstruction(kUmull, kArithmetic);
3486  os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
3487       << ", " << rdhi << ", " << rn << ", " << rm;
3488}
3489
3490void Disassembler::umulls(
3491    Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3492  os().SetCurrentInstruction(kUmulls, kArithmetic);
3493  os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
3494       << ", " << rdhi << ", " << rn << ", " << rm;
3495}
3496
3497void Disassembler::uqadd16(Condition cond,
3498                           Register rd,
3499                           Register rn,
3500                           Register rm) {
3501  os().SetCurrentInstruction(kUqadd16, kArithmetic);
3502  os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond);
3503  os() << " ";
3504  if (!rd.Is(rn) || !use_short_hand_form_) {
3505    os() << rd << ", ";
3506  }
3507  os() << rn << ", " << rm;
3508}
3509
3510void Disassembler::uqadd8(Condition cond,
3511                          Register rd,
3512                          Register rn,
3513                          Register rm) {
3514  os().SetCurrentInstruction(kUqadd8, kArithmetic);
3515  os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond);
3516  os() << " ";
3517  if (!rd.Is(rn) || !use_short_hand_form_) {
3518    os() << rd << ", ";
3519  }
3520  os() << rn << ", " << rm;
3521}
3522
3523void Disassembler::uqasx(Condition cond,
3524                         Register rd,
3525                         Register rn,
3526                         Register rm) {
3527  os().SetCurrentInstruction(kUqasx, kArithmetic);
3528  os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond);
3529  os() << " ";
3530  if (!rd.Is(rn) || !use_short_hand_form_) {
3531    os() << rd << ", ";
3532  }
3533  os() << rn << ", " << rm;
3534}
3535
3536void Disassembler::uqsax(Condition cond,
3537                         Register rd,
3538                         Register rn,
3539                         Register rm) {
3540  os().SetCurrentInstruction(kUqsax, kArithmetic);
3541  os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond);
3542  os() << " ";
3543  if (!rd.Is(rn) || !use_short_hand_form_) {
3544    os() << rd << ", ";
3545  }
3546  os() << rn << ", " << rm;
3547}
3548
3549void Disassembler::uqsub16(Condition cond,
3550                           Register rd,
3551                           Register rn,
3552                           Register rm) {
3553  os().SetCurrentInstruction(kUqsub16, kArithmetic);
3554  os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond);
3555  os() << " ";
3556  if (!rd.Is(rn) || !use_short_hand_form_) {
3557    os() << rd << ", ";
3558  }
3559  os() << rn << ", " << rm;
3560}
3561
3562void Disassembler::uqsub8(Condition cond,
3563                          Register rd,
3564                          Register rn,
3565                          Register rm) {
3566  os().SetCurrentInstruction(kUqsub8, kArithmetic);
3567  os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond);
3568  os() << " ";
3569  if (!rd.Is(rn) || !use_short_hand_form_) {
3570    os() << rd << ", ";
3571  }
3572  os() << rn << ", " << rm;
3573}
3574
3575void Disassembler::usad8(Condition cond,
3576                         Register rd,
3577                         Register rn,
3578                         Register rm) {
3579  os().SetCurrentInstruction(kUsad8, kArithmetic);
3580  os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond);
3581  os() << " ";
3582  if (!rd.Is(rn) || !use_short_hand_form_) {
3583    os() << rd << ", ";
3584  }
3585  os() << rn << ", " << rm;
3586}
3587
3588void Disassembler::usada8(
3589    Condition cond, Register rd, Register rn, Register rm, Register ra) {
3590  os().SetCurrentInstruction(kUsada8, kArithmetic);
3591  os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd
3592       << ", " << rn << ", " << rm << ", " << ra;
3593}
3594
3595void Disassembler::usat(Condition cond,
3596                        Register rd,
3597                        uint32_t imm,
3598                        const Operand& operand) {
3599  os().SetCurrentInstruction(kUsat, kArithmetic);
3600  os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd
3601       << ", " << ImmediatePrinter(imm) << ", " << operand;
3602}
3603
3604void Disassembler::usat16(Condition cond,
3605                          Register rd,
3606                          uint32_t imm,
3607                          Register rn) {
3608  os().SetCurrentInstruction(kUsat16, kArithmetic);
3609  os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd
3610       << ", " << ImmediatePrinter(imm) << ", " << rn;
3611}
3612
3613void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) {
3614  os().SetCurrentInstruction(kUsax, kArithmetic);
3615  os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond);
3616  os() << " ";
3617  if (!rd.Is(rn) || !use_short_hand_form_) {
3618    os() << rd << ", ";
3619  }
3620  os() << rn << ", " << rm;
3621}
3622
3623void Disassembler::usub16(Condition cond,
3624                          Register rd,
3625                          Register rn,
3626                          Register rm) {
3627  os().SetCurrentInstruction(kUsub16, kArithmetic);
3628  os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond);
3629  os() << " ";
3630  if (!rd.Is(rn) || !use_short_hand_form_) {
3631    os() << rd << ", ";
3632  }
3633  os() << rn << ", " << rm;
3634}
3635
3636void Disassembler::usub8(Condition cond,
3637                         Register rd,
3638                         Register rn,
3639                         Register rm) {
3640  os().SetCurrentInstruction(kUsub8, kArithmetic);
3641  os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond);
3642  os() << " ";
3643  if (!rd.Is(rn) || !use_short_hand_form_) {
3644    os() << rd << ", ";
3645  }
3646  os() << rn << ", " << rm;
3647}
3648
3649void Disassembler::uxtab(Condition cond,
3650                         Register rd,
3651                         Register rn,
3652                         const Operand& operand) {
3653  os().SetCurrentInstruction(kUxtab, kArithmetic);
3654  os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond);
3655  os() << " ";
3656  if (!rd.Is(rn) || !use_short_hand_form_) {
3657    os() << rd << ", ";
3658  }
3659  os() << rn << ", " << operand;
3660}
3661
3662void Disassembler::uxtab16(Condition cond,
3663                           Register rd,
3664                           Register rn,
3665                           const Operand& operand) {
3666  os().SetCurrentInstruction(kUxtab16, kArithmetic);
3667  os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond);
3668  os() << " ";
3669  if (!rd.Is(rn) || !use_short_hand_form_) {
3670    os() << rd << ", ";
3671  }
3672  os() << rn << ", " << operand;
3673}
3674
3675void Disassembler::uxtah(Condition cond,
3676                         Register rd,
3677                         Register rn,
3678                         const Operand& operand) {
3679  os().SetCurrentInstruction(kUxtah, kArithmetic);
3680  os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond);
3681  os() << " ";
3682  if (!rd.Is(rn) || !use_short_hand_form_) {
3683    os() << rd << ", ";
3684  }
3685  os() << rn << ", " << operand;
3686}
3687
3688void Disassembler::uxtb(Condition cond,
3689                        EncodingSize size,
3690                        Register rd,
3691                        const Operand& operand) {
3692  os().SetCurrentInstruction(kUxtb, kArithmetic);
3693  os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size;
3694  os() << " ";
3695  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3696    os() << rd << ", ";
3697  }
3698  os() << operand;
3699}
3700
3701void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) {
3702  os().SetCurrentInstruction(kUxtb16, kArithmetic);
3703  os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond);
3704  os() << " ";
3705  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3706    os() << rd << ", ";
3707  }
3708  os() << operand;
3709}
3710
3711void Disassembler::uxth(Condition cond,
3712                        EncodingSize size,
3713                        Register rd,
3714                        const Operand& operand) {
3715  os().SetCurrentInstruction(kUxth, kArithmetic);
3716  os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size;
3717  os() << " ";
3718  if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
3719    os() << rd << ", ";
3720  }
3721  os() << operand;
3722}
3723
3724void Disassembler::vaba(
3725    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3726  os().SetCurrentInstruction(kVaba, kFpNeon);
3727  os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
3728       << rd << ", " << rn << ", " << rm;
3729}
3730
3731void Disassembler::vaba(
3732    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3733  os().SetCurrentInstruction(kVaba, kFpNeon);
3734  os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
3735       << rd << ", " << rn << ", " << rm;
3736}
3737
3738void Disassembler::vabal(
3739    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3740  os().SetCurrentInstruction(kVabal, kFpNeon);
3741  os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " "
3742       << rd << ", " << rn << ", " << rm;
3743}
3744
3745void Disassembler::vabd(
3746    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3747  os().SetCurrentInstruction(kVabd, kFpNeon);
3748  os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
3749  os() << " ";
3750  if (!rd.Is(rn) || !use_short_hand_form_) {
3751    os() << rd << ", ";
3752  }
3753  os() << rn << ", " << rm;
3754}
3755
3756void Disassembler::vabd(
3757    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3758  os().SetCurrentInstruction(kVabd, kFpNeon);
3759  os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
3760  os() << " ";
3761  if (!rd.Is(rn) || !use_short_hand_form_) {
3762    os() << rd << ", ";
3763  }
3764  os() << rn << ", " << rm;
3765}
3766
3767void Disassembler::vabdl(
3768    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3769  os().SetCurrentInstruction(kVabdl, kFpNeon);
3770  os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " "
3771       << rd << ", " << rn << ", " << rm;
3772}
3773
3774void Disassembler::vabs(Condition cond,
3775                        DataType dt,
3776                        DRegister rd,
3777                        DRegister rm) {
3778  os().SetCurrentInstruction(kVabs, kFpNeon);
3779  os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3780       << rd << ", " << rm;
3781}
3782
3783void Disassembler::vabs(Condition cond,
3784                        DataType dt,
3785                        QRegister rd,
3786                        QRegister rm) {
3787  os().SetCurrentInstruction(kVabs, kFpNeon);
3788  os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3789       << rd << ", " << rm;
3790}
3791
3792void Disassembler::vabs(Condition cond,
3793                        DataType dt,
3794                        SRegister rd,
3795                        SRegister rm) {
3796  os().SetCurrentInstruction(kVabs, kFpNeon);
3797  os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3798       << rd << ", " << rm;
3799}
3800
3801void Disassembler::vacge(
3802    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3803  os().SetCurrentInstruction(kVacge, kFpNeon);
3804  os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
3805  os() << " ";
3806  if (!rd.Is(rn) || !use_short_hand_form_) {
3807    os() << rd << ", ";
3808  }
3809  os() << rn << ", " << rm;
3810}
3811
3812void Disassembler::vacge(
3813    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3814  os().SetCurrentInstruction(kVacge, kFpNeon);
3815  os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
3816  os() << " ";
3817  if (!rd.Is(rn) || !use_short_hand_form_) {
3818    os() << rd << ", ";
3819  }
3820  os() << rn << ", " << rm;
3821}
3822
3823void Disassembler::vacgt(
3824    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3825  os().SetCurrentInstruction(kVacgt, kFpNeon);
3826  os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
3827  os() << " ";
3828  if (!rd.Is(rn) || !use_short_hand_form_) {
3829    os() << rd << ", ";
3830  }
3831  os() << rn << ", " << rm;
3832}
3833
3834void Disassembler::vacgt(
3835    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3836  os().SetCurrentInstruction(kVacgt, kFpNeon);
3837  os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
3838  os() << " ";
3839  if (!rd.Is(rn) || !use_short_hand_form_) {
3840    os() << rd << ", ";
3841  }
3842  os() << rn << ", " << rm;
3843}
3844
3845void Disassembler::vacle(
3846    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3847  os().SetCurrentInstruction(kVacle, kFpNeon);
3848  os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
3849  os() << " ";
3850  if (!rd.Is(rn) || !use_short_hand_form_) {
3851    os() << rd << ", ";
3852  }
3853  os() << rn << ", " << rm;
3854}
3855
3856void Disassembler::vacle(
3857    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3858  os().SetCurrentInstruction(kVacle, kFpNeon);
3859  os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
3860  os() << " ";
3861  if (!rd.Is(rn) || !use_short_hand_form_) {
3862    os() << rd << ", ";
3863  }
3864  os() << rn << ", " << rm;
3865}
3866
3867void Disassembler::vaclt(
3868    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3869  os().SetCurrentInstruction(kVaclt, kFpNeon);
3870  os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
3871  os() << " ";
3872  if (!rd.Is(rn) || !use_short_hand_form_) {
3873    os() << rd << ", ";
3874  }
3875  os() << rn << ", " << rm;
3876}
3877
3878void Disassembler::vaclt(
3879    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3880  os().SetCurrentInstruction(kVaclt, kFpNeon);
3881  os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
3882  os() << " ";
3883  if (!rd.Is(rn) || !use_short_hand_form_) {
3884    os() << rd << ", ";
3885  }
3886  os() << rn << ", " << rm;
3887}
3888
3889void Disassembler::vadd(
3890    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3891  os().SetCurrentInstruction(kVadd, kFpNeon);
3892  os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
3893  os() << " ";
3894  if (!rd.Is(rn) || !use_short_hand_form_) {
3895    os() << rd << ", ";
3896  }
3897  os() << rn << ", " << rm;
3898}
3899
3900void Disassembler::vadd(
3901    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3902  os().SetCurrentInstruction(kVadd, kFpNeon);
3903  os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
3904  os() << " ";
3905  if (!rd.Is(rn) || !use_short_hand_form_) {
3906    os() << rd << ", ";
3907  }
3908  os() << rn << ", " << rm;
3909}
3910
3911void Disassembler::vadd(
3912    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
3913  os().SetCurrentInstruction(kVadd, kFpNeon);
3914  os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
3915  os() << " ";
3916  if (!rd.Is(rn) || !use_short_hand_form_) {
3917    os() << rd << ", ";
3918  }
3919  os() << rn << ", " << rm;
3920}
3921
3922void Disassembler::vaddhn(
3923    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
3924  os().SetCurrentInstruction(kVaddhn, kFpNeon);
3925  os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " "
3926       << rd << ", " << rn << ", " << rm;
3927}
3928
3929void Disassembler::vaddl(
3930    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3931  os().SetCurrentInstruction(kVaddl, kFpNeon);
3932  os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " "
3933       << rd << ", " << rn << ", " << rm;
3934}
3935
3936void Disassembler::vaddw(
3937    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
3938  os().SetCurrentInstruction(kVaddw, kFpNeon);
3939  os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt;
3940  os() << " ";
3941  if (!rd.Is(rn) || !use_short_hand_form_) {
3942    os() << rd << ", ";
3943  }
3944  os() << rn << ", " << rm;
3945}
3946
3947void Disassembler::vand(Condition cond,
3948                        DataType dt,
3949                        DRegister rd,
3950                        DRegister rn,
3951                        const DOperand& operand) {
3952  os().SetCurrentInstruction(kVand, kFpNeon);
3953  os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
3954  os() << " ";
3955  if (!rd.Is(rn) || !use_short_hand_form_) {
3956    os() << rd << ", ";
3957  }
3958  os() << rn << ", " << operand;
3959}
3960
3961void Disassembler::vand(Condition cond,
3962                        DataType dt,
3963                        QRegister rd,
3964                        QRegister rn,
3965                        const QOperand& operand) {
3966  os().SetCurrentInstruction(kVand, kFpNeon);
3967  os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
3968  os() << " ";
3969  if (!rd.Is(rn) || !use_short_hand_form_) {
3970    os() << rd << ", ";
3971  }
3972  os() << rn << ", " << operand;
3973}
3974
3975void Disassembler::vbic(Condition cond,
3976                        DataType dt,
3977                        DRegister rd,
3978                        DRegister rn,
3979                        const DOperand& operand) {
3980  os().SetCurrentInstruction(kVbic, kFpNeon);
3981  os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
3982  os() << " ";
3983  if (!rd.Is(rn) || !use_short_hand_form_) {
3984    os() << rd << ", ";
3985  }
3986  os() << rn << ", " << operand;
3987}
3988
3989void Disassembler::vbic(Condition cond,
3990                        DataType dt,
3991                        QRegister rd,
3992                        QRegister rn,
3993                        const QOperand& operand) {
3994  os().SetCurrentInstruction(kVbic, kFpNeon);
3995  os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
3996  os() << " ";
3997  if (!rd.Is(rn) || !use_short_hand_form_) {
3998    os() << rd << ", ";
3999  }
4000  os() << rn << ", " << operand;
4001}
4002
4003void Disassembler::vbif(
4004    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4005  os().SetCurrentInstruction(kVbif, kFpNeon);
4006  os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
4007  os() << " ";
4008  if (!rd.Is(rn) || !use_short_hand_form_) {
4009    os() << rd << ", ";
4010  }
4011  os() << rn << ", " << rm;
4012}
4013
4014void Disassembler::vbif(
4015    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4016  os().SetCurrentInstruction(kVbif, kFpNeon);
4017  os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
4018  os() << " ";
4019  if (!rd.Is(rn) || !use_short_hand_form_) {
4020    os() << rd << ", ";
4021  }
4022  os() << rn << ", " << rm;
4023}
4024
4025void Disassembler::vbit(
4026    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4027  os().SetCurrentInstruction(kVbit, kFpNeon);
4028  os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
4029  os() << " ";
4030  if (!rd.Is(rn) || !use_short_hand_form_) {
4031    os() << rd << ", ";
4032  }
4033  os() << rn << ", " << rm;
4034}
4035
4036void Disassembler::vbit(
4037    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4038  os().SetCurrentInstruction(kVbit, kFpNeon);
4039  os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
4040  os() << " ";
4041  if (!rd.Is(rn) || !use_short_hand_form_) {
4042    os() << rd << ", ";
4043  }
4044  os() << rn << ", " << rm;
4045}
4046
4047void Disassembler::vbsl(
4048    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4049  os().SetCurrentInstruction(kVbsl, kFpNeon);
4050  os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
4051  os() << " ";
4052  if (!rd.Is(rn) || !use_short_hand_form_) {
4053    os() << rd << ", ";
4054  }
4055  os() << rn << ", " << rm;
4056}
4057
4058void Disassembler::vbsl(
4059    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4060  os().SetCurrentInstruction(kVbsl, kFpNeon);
4061  os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
4062  os() << " ";
4063  if (!rd.Is(rn) || !use_short_hand_form_) {
4064    os() << rd << ", ";
4065  }
4066  os() << rn << ", " << rm;
4067}
4068
4069void Disassembler::vceq(Condition cond,
4070                        DataType dt,
4071                        DRegister rd,
4072                        DRegister rm,
4073                        const DOperand& operand) {
4074  os().SetCurrentInstruction(kVceq, kFpNeon);
4075  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4076  os() << " ";
4077  if (!rd.Is(rm) || !use_short_hand_form_) {
4078    os() << rd << ", ";
4079  }
4080  os() << rm << ", " << operand;
4081}
4082
4083void Disassembler::vceq(Condition cond,
4084                        DataType dt,
4085                        QRegister rd,
4086                        QRegister rm,
4087                        const QOperand& operand) {
4088  os().SetCurrentInstruction(kVceq, kFpNeon);
4089  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4090  os() << " ";
4091  if (!rd.Is(rm) || !use_short_hand_form_) {
4092    os() << rd << ", ";
4093  }
4094  os() << rm << ", " << operand;
4095}
4096
4097void Disassembler::vceq(
4098    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4099  os().SetCurrentInstruction(kVceq, kFpNeon);
4100  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4101  os() << " ";
4102  if (!rd.Is(rn) || !use_short_hand_form_) {
4103    os() << rd << ", ";
4104  }
4105  os() << rn << ", " << rm;
4106}
4107
4108void Disassembler::vceq(
4109    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4110  os().SetCurrentInstruction(kVceq, kFpNeon);
4111  os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4112  os() << " ";
4113  if (!rd.Is(rn) || !use_short_hand_form_) {
4114    os() << rd << ", ";
4115  }
4116  os() << rn << ", " << rm;
4117}
4118
4119void Disassembler::vcge(Condition cond,
4120                        DataType dt,
4121                        DRegister rd,
4122                        DRegister rm,
4123                        const DOperand& operand) {
4124  os().SetCurrentInstruction(kVcge, kFpNeon);
4125  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4126  os() << " ";
4127  if (!rd.Is(rm) || !use_short_hand_form_) {
4128    os() << rd << ", ";
4129  }
4130  os() << rm << ", " << operand;
4131}
4132
4133void Disassembler::vcge(Condition cond,
4134                        DataType dt,
4135                        QRegister rd,
4136                        QRegister rm,
4137                        const QOperand& operand) {
4138  os().SetCurrentInstruction(kVcge, kFpNeon);
4139  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4140  os() << " ";
4141  if (!rd.Is(rm) || !use_short_hand_form_) {
4142    os() << rd << ", ";
4143  }
4144  os() << rm << ", " << operand;
4145}
4146
4147void Disassembler::vcge(
4148    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4149  os().SetCurrentInstruction(kVcge, kFpNeon);
4150  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4151  os() << " ";
4152  if (!rd.Is(rn) || !use_short_hand_form_) {
4153    os() << rd << ", ";
4154  }
4155  os() << rn << ", " << rm;
4156}
4157
4158void Disassembler::vcge(
4159    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4160  os().SetCurrentInstruction(kVcge, kFpNeon);
4161  os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4162  os() << " ";
4163  if (!rd.Is(rn) || !use_short_hand_form_) {
4164    os() << rd << ", ";
4165  }
4166  os() << rn << ", " << rm;
4167}
4168
4169void Disassembler::vcgt(Condition cond,
4170                        DataType dt,
4171                        DRegister rd,
4172                        DRegister rm,
4173                        const DOperand& operand) {
4174  os().SetCurrentInstruction(kVcgt, kFpNeon);
4175  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4176  os() << " ";
4177  if (!rd.Is(rm) || !use_short_hand_form_) {
4178    os() << rd << ", ";
4179  }
4180  os() << rm << ", " << operand;
4181}
4182
4183void Disassembler::vcgt(Condition cond,
4184                        DataType dt,
4185                        QRegister rd,
4186                        QRegister rm,
4187                        const QOperand& operand) {
4188  os().SetCurrentInstruction(kVcgt, kFpNeon);
4189  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4190  os() << " ";
4191  if (!rd.Is(rm) || !use_short_hand_form_) {
4192    os() << rd << ", ";
4193  }
4194  os() << rm << ", " << operand;
4195}
4196
4197void Disassembler::vcgt(
4198    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4199  os().SetCurrentInstruction(kVcgt, kFpNeon);
4200  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4201  os() << " ";
4202  if (!rd.Is(rn) || !use_short_hand_form_) {
4203    os() << rd << ", ";
4204  }
4205  os() << rn << ", " << rm;
4206}
4207
4208void Disassembler::vcgt(
4209    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4210  os().SetCurrentInstruction(kVcgt, kFpNeon);
4211  os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4212  os() << " ";
4213  if (!rd.Is(rn) || !use_short_hand_form_) {
4214    os() << rd << ", ";
4215  }
4216  os() << rn << ", " << rm;
4217}
4218
4219void Disassembler::vcle(Condition cond,
4220                        DataType dt,
4221                        DRegister rd,
4222                        DRegister rm,
4223                        const DOperand& operand) {
4224  os().SetCurrentInstruction(kVcle, kFpNeon);
4225  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4226  os() << " ";
4227  if (!rd.Is(rm) || !use_short_hand_form_) {
4228    os() << rd << ", ";
4229  }
4230  os() << rm << ", " << operand;
4231}
4232
4233void Disassembler::vcle(Condition cond,
4234                        DataType dt,
4235                        QRegister rd,
4236                        QRegister rm,
4237                        const QOperand& operand) {
4238  os().SetCurrentInstruction(kVcle, kFpNeon);
4239  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4240  os() << " ";
4241  if (!rd.Is(rm) || !use_short_hand_form_) {
4242    os() << rd << ", ";
4243  }
4244  os() << rm << ", " << operand;
4245}
4246
4247void Disassembler::vcle(
4248    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4249  os().SetCurrentInstruction(kVcle, kFpNeon);
4250  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4251  os() << " ";
4252  if (!rd.Is(rn) || !use_short_hand_form_) {
4253    os() << rd << ", ";
4254  }
4255  os() << rn << ", " << rm;
4256}
4257
4258void Disassembler::vcle(
4259    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4260  os().SetCurrentInstruction(kVcle, kFpNeon);
4261  os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4262  os() << " ";
4263  if (!rd.Is(rn) || !use_short_hand_form_) {
4264    os() << rd << ", ";
4265  }
4266  os() << rn << ", " << rm;
4267}
4268
4269void Disassembler::vcls(Condition cond,
4270                        DataType dt,
4271                        DRegister rd,
4272                        DRegister rm) {
4273  os().SetCurrentInstruction(kVcls, kFpNeon);
4274  os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
4275       << rd << ", " << rm;
4276}
4277
4278void Disassembler::vcls(Condition cond,
4279                        DataType dt,
4280                        QRegister rd,
4281                        QRegister rm) {
4282  os().SetCurrentInstruction(kVcls, kFpNeon);
4283  os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
4284       << rd << ", " << rm;
4285}
4286
4287void Disassembler::vclt(Condition cond,
4288                        DataType dt,
4289                        DRegister rd,
4290                        DRegister rm,
4291                        const DOperand& operand) {
4292  os().SetCurrentInstruction(kVclt, kFpNeon);
4293  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4294  os() << " ";
4295  if (!rd.Is(rm) || !use_short_hand_form_) {
4296    os() << rd << ", ";
4297  }
4298  os() << rm << ", " << operand;
4299}
4300
4301void Disassembler::vclt(Condition cond,
4302                        DataType dt,
4303                        QRegister rd,
4304                        QRegister rm,
4305                        const QOperand& operand) {
4306  os().SetCurrentInstruction(kVclt, kFpNeon);
4307  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4308  os() << " ";
4309  if (!rd.Is(rm) || !use_short_hand_form_) {
4310    os() << rd << ", ";
4311  }
4312  os() << rm << ", " << operand;
4313}
4314
4315void Disassembler::vclt(
4316    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4317  os().SetCurrentInstruction(kVclt, kFpNeon);
4318  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4319  os() << " ";
4320  if (!rd.Is(rn) || !use_short_hand_form_) {
4321    os() << rd << ", ";
4322  }
4323  os() << rn << ", " << rm;
4324}
4325
4326void Disassembler::vclt(
4327    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4328  os().SetCurrentInstruction(kVclt, kFpNeon);
4329  os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4330  os() << " ";
4331  if (!rd.Is(rn) || !use_short_hand_form_) {
4332    os() << rd << ", ";
4333  }
4334  os() << rn << ", " << rm;
4335}
4336
4337void Disassembler::vclz(Condition cond,
4338                        DataType dt,
4339                        DRegister rd,
4340                        DRegister rm) {
4341  os().SetCurrentInstruction(kVclz, kFpNeon);
4342  os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
4343       << rd << ", " << rm;
4344}
4345
4346void Disassembler::vclz(Condition cond,
4347                        DataType dt,
4348                        QRegister rd,
4349                        QRegister rm) {
4350  os().SetCurrentInstruction(kVclz, kFpNeon);
4351  os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
4352       << rd << ", " << rm;
4353}
4354
4355void Disassembler::vcmp(Condition cond,
4356                        DataType dt,
4357                        SRegister rd,
4358                        const SOperand& operand) {
4359  os().SetCurrentInstruction(kVcmp, kFpNeon);
4360  os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4361       << rd << ", " << operand;
4362}
4363
4364void Disassembler::vcmp(Condition cond,
4365                        DataType dt,
4366                        DRegister rd,
4367                        const DOperand& operand) {
4368  os().SetCurrentInstruction(kVcmp, kFpNeon);
4369  os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4370       << rd << ", " << operand;
4371}
4372
4373void Disassembler::vcmpe(Condition cond,
4374                         DataType dt,
4375                         SRegister rd,
4376                         const SOperand& operand) {
4377  os().SetCurrentInstruction(kVcmpe, kFpNeon);
4378  os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4379       << rd << ", " << operand;
4380}
4381
4382void Disassembler::vcmpe(Condition cond,
4383                         DataType dt,
4384                         DRegister rd,
4385                         const DOperand& operand) {
4386  os().SetCurrentInstruction(kVcmpe, kFpNeon);
4387  os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4388       << rd << ", " << operand;
4389}
4390
4391void Disassembler::vcnt(Condition cond,
4392                        DataType dt,
4393                        DRegister rd,
4394                        DRegister rm) {
4395  os().SetCurrentInstruction(kVcnt, kFpNeon);
4396  os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
4397       << rd << ", " << rm;
4398}
4399
4400void Disassembler::vcnt(Condition cond,
4401                        DataType dt,
4402                        QRegister rd,
4403                        QRegister rm) {
4404  os().SetCurrentInstruction(kVcnt, kFpNeon);
4405  os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
4406       << rd << ", " << rm;
4407}
4408
4409void Disassembler::vcvt(
4410    Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4411  os().SetCurrentInstruction(kVcvt, kFpNeon);
4412  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4413       << " " << rd << ", " << rm;
4414}
4415
4416void Disassembler::vcvt(
4417    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4418  os().SetCurrentInstruction(kVcvt, kFpNeon);
4419  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4420       << " " << rd << ", " << rm;
4421}
4422
4423void Disassembler::vcvt(Condition cond,
4424                        DataType dt1,
4425                        DataType dt2,
4426                        DRegister rd,
4427                        DRegister rm,
4428                        int32_t fbits) {
4429  os().SetCurrentInstruction(kVcvt, kFpNeon);
4430  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4431       << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
4432}
4433
4434void Disassembler::vcvt(Condition cond,
4435                        DataType dt1,
4436                        DataType dt2,
4437                        QRegister rd,
4438                        QRegister rm,
4439                        int32_t fbits) {
4440  os().SetCurrentInstruction(kVcvt, kFpNeon);
4441  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4442       << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
4443}
4444
4445void Disassembler::vcvt(Condition cond,
4446                        DataType dt1,
4447                        DataType dt2,
4448                        SRegister rd,
4449                        SRegister rm,
4450                        int32_t fbits) {
4451  os().SetCurrentInstruction(kVcvt, kFpNeon);
4452  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4453       << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
4454}
4455
4456void Disassembler::vcvt(
4457    Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
4458  os().SetCurrentInstruction(kVcvt, kFpNeon);
4459  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4460       << " " << rd << ", " << rm;
4461}
4462
4463void Disassembler::vcvt(
4464    Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
4465  os().SetCurrentInstruction(kVcvt, kFpNeon);
4466  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4467       << " " << rd << ", " << rm;
4468}
4469
4470void Disassembler::vcvt(
4471    Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
4472  os().SetCurrentInstruction(kVcvt, kFpNeon);
4473  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4474       << " " << rd << ", " << rm;
4475}
4476
4477void Disassembler::vcvt(
4478    Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
4479  os().SetCurrentInstruction(kVcvt, kFpNeon);
4480  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4481       << " " << rd << ", " << rm;
4482}
4483
4484void Disassembler::vcvt(
4485    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4486  os().SetCurrentInstruction(kVcvt, kFpNeon);
4487  os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4488       << " " << rd << ", " << rm;
4489}
4490
4491void Disassembler::vcvta(DataType dt1,
4492                         DataType dt2,
4493                         DRegister rd,
4494                         DRegister rm) {
4495  os().SetCurrentInstruction(kVcvta, kFpNeon);
4496  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4497}
4498
4499void Disassembler::vcvta(DataType dt1,
4500                         DataType dt2,
4501                         QRegister rd,
4502                         QRegister rm) {
4503  os().SetCurrentInstruction(kVcvta, kFpNeon);
4504  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4505}
4506
4507void Disassembler::vcvta(DataType dt1,
4508                         DataType dt2,
4509                         SRegister rd,
4510                         SRegister rm) {
4511  os().SetCurrentInstruction(kVcvta, kFpNeon);
4512  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4513}
4514
4515void Disassembler::vcvta(DataType dt1,
4516                         DataType dt2,
4517                         SRegister rd,
4518                         DRegister rm) {
4519  os().SetCurrentInstruction(kVcvta, kFpNeon);
4520  os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4521}
4522
4523void Disassembler::vcvtb(
4524    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4525  os().SetCurrentInstruction(kVcvtb, kFpNeon);
4526  os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4527       << " " << rd << ", " << rm;
4528}
4529
4530void Disassembler::vcvtb(
4531    Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4532  os().SetCurrentInstruction(kVcvtb, kFpNeon);
4533  os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4534       << " " << rd << ", " << rm;
4535}
4536
4537void Disassembler::vcvtb(
4538    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4539  os().SetCurrentInstruction(kVcvtb, kFpNeon);
4540  os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4541       << " " << rd << ", " << rm;
4542}
4543
4544void Disassembler::vcvtm(DataType dt1,
4545                         DataType dt2,
4546                         DRegister rd,
4547                         DRegister rm) {
4548  os().SetCurrentInstruction(kVcvtm, kFpNeon);
4549  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4550}
4551
4552void Disassembler::vcvtm(DataType dt1,
4553                         DataType dt2,
4554                         QRegister rd,
4555                         QRegister rm) {
4556  os().SetCurrentInstruction(kVcvtm, kFpNeon);
4557  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4558}
4559
4560void Disassembler::vcvtm(DataType dt1,
4561                         DataType dt2,
4562                         SRegister rd,
4563                         SRegister rm) {
4564  os().SetCurrentInstruction(kVcvtm, kFpNeon);
4565  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4566}
4567
4568void Disassembler::vcvtm(DataType dt1,
4569                         DataType dt2,
4570                         SRegister rd,
4571                         DRegister rm) {
4572  os().SetCurrentInstruction(kVcvtm, kFpNeon);
4573  os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4574}
4575
4576void Disassembler::vcvtn(DataType dt1,
4577                         DataType dt2,
4578                         DRegister rd,
4579                         DRegister rm) {
4580  os().SetCurrentInstruction(kVcvtn, kFpNeon);
4581  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4582}
4583
4584void Disassembler::vcvtn(DataType dt1,
4585                         DataType dt2,
4586                         QRegister rd,
4587                         QRegister rm) {
4588  os().SetCurrentInstruction(kVcvtn, kFpNeon);
4589  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4590}
4591
4592void Disassembler::vcvtn(DataType dt1,
4593                         DataType dt2,
4594                         SRegister rd,
4595                         SRegister rm) {
4596  os().SetCurrentInstruction(kVcvtn, kFpNeon);
4597  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4598}
4599
4600void Disassembler::vcvtn(DataType dt1,
4601                         DataType dt2,
4602                         SRegister rd,
4603                         DRegister rm) {
4604  os().SetCurrentInstruction(kVcvtn, kFpNeon);
4605  os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4606}
4607
4608void Disassembler::vcvtp(DataType dt1,
4609                         DataType dt2,
4610                         DRegister rd,
4611                         DRegister rm) {
4612  os().SetCurrentInstruction(kVcvtp, kFpNeon);
4613  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4614}
4615
4616void Disassembler::vcvtp(DataType dt1,
4617                         DataType dt2,
4618                         QRegister rd,
4619                         QRegister rm) {
4620  os().SetCurrentInstruction(kVcvtp, kFpNeon);
4621  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4622}
4623
4624void Disassembler::vcvtp(DataType dt1,
4625                         DataType dt2,
4626                         SRegister rd,
4627                         SRegister rm) {
4628  os().SetCurrentInstruction(kVcvtp, kFpNeon);
4629  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4630}
4631
4632void Disassembler::vcvtp(DataType dt1,
4633                         DataType dt2,
4634                         SRegister rd,
4635                         DRegister rm) {
4636  os().SetCurrentInstruction(kVcvtp, kFpNeon);
4637  os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4638}
4639
4640void Disassembler::vcvtr(
4641    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4642  os().SetCurrentInstruction(kVcvtr, kFpNeon);
4643  os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4644       << " " << rd << ", " << rm;
4645}
4646
4647void Disassembler::vcvtr(
4648    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4649  os().SetCurrentInstruction(kVcvtr, kFpNeon);
4650  os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4651       << " " << rd << ", " << rm;
4652}
4653
4654void Disassembler::vcvtt(
4655    Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4656  os().SetCurrentInstruction(kVcvtt, kFpNeon);
4657  os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4658       << " " << rd << ", " << rm;
4659}
4660
4661void Disassembler::vcvtt(
4662    Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4663  os().SetCurrentInstruction(kVcvtt, kFpNeon);
4664  os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4665       << " " << rd << ", " << rm;
4666}
4667
4668void Disassembler::vcvtt(
4669    Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4670  os().SetCurrentInstruction(kVcvtt, kFpNeon);
4671  os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4672       << " " << rd << ", " << rm;
4673}
4674
4675void Disassembler::vdiv(
4676    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4677  os().SetCurrentInstruction(kVdiv, kFpNeon);
4678  os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
4679  os() << " ";
4680  if (!rd.Is(rn) || !use_short_hand_form_) {
4681    os() << rd << ", ";
4682  }
4683  os() << rn << ", " << rm;
4684}
4685
4686void Disassembler::vdiv(
4687    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4688  os().SetCurrentInstruction(kVdiv, kFpNeon);
4689  os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
4690  os() << " ";
4691  if (!rd.Is(rn) || !use_short_hand_form_) {
4692    os() << rd << ", ";
4693  }
4694  os() << rn << ", " << rm;
4695}
4696
4697void Disassembler::vdup(Condition cond,
4698                        DataType dt,
4699                        QRegister rd,
4700                        Register rt) {
4701  os().SetCurrentInstruction(kVdup, kFpNeon);
4702  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4703       << rd << ", " << rt;
4704}
4705
4706void Disassembler::vdup(Condition cond,
4707                        DataType dt,
4708                        DRegister rd,
4709                        Register rt) {
4710  os().SetCurrentInstruction(kVdup, kFpNeon);
4711  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4712       << rd << ", " << rt;
4713}
4714
4715void Disassembler::vdup(Condition cond,
4716                        DataType dt,
4717                        DRegister rd,
4718                        DRegisterLane rm) {
4719  os().SetCurrentInstruction(kVdup, kFpNeon);
4720  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4721       << rd << ", " << rm;
4722}
4723
4724void Disassembler::vdup(Condition cond,
4725                        DataType dt,
4726                        QRegister rd,
4727                        DRegisterLane rm) {
4728  os().SetCurrentInstruction(kVdup, kFpNeon);
4729  os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4730       << rd << ", " << rm;
4731}
4732
4733void Disassembler::veor(
4734    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4735  os().SetCurrentInstruction(kVeor, kFpNeon);
4736  os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
4737  os() << " ";
4738  if (!rd.Is(rn) || !use_short_hand_form_) {
4739    os() << rd << ", ";
4740  }
4741  os() << rn << ", " << rm;
4742}
4743
4744void Disassembler::veor(
4745    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4746  os().SetCurrentInstruction(kVeor, kFpNeon);
4747  os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
4748  os() << " ";
4749  if (!rd.Is(rn) || !use_short_hand_form_) {
4750    os() << rd << ", ";
4751  }
4752  os() << rn << ", " << rm;
4753}
4754
4755void Disassembler::vext(Condition cond,
4756                        DataType dt,
4757                        DRegister rd,
4758                        DRegister rn,
4759                        DRegister rm,
4760                        const DOperand& operand) {
4761  os().SetCurrentInstruction(kVext, kFpNeon);
4762  os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
4763  os() << " ";
4764  if (!rd.Is(rn) || !use_short_hand_form_) {
4765    os() << rd << ", ";
4766  }
4767  os() << rn << ", " << rm << ", " << operand;
4768}
4769
4770void Disassembler::vext(Condition cond,
4771                        DataType dt,
4772                        QRegister rd,
4773                        QRegister rn,
4774                        QRegister rm,
4775                        const QOperand& operand) {
4776  os().SetCurrentInstruction(kVext, kFpNeon);
4777  os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
4778  os() << " ";
4779  if (!rd.Is(rn) || !use_short_hand_form_) {
4780    os() << rd << ", ";
4781  }
4782  os() << rn << ", " << rm << ", " << operand;
4783}
4784
4785void Disassembler::vfma(
4786    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4787  os().SetCurrentInstruction(kVfma, kFpNeon);
4788  os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4789       << rd << ", " << rn << ", " << rm;
4790}
4791
4792void Disassembler::vfma(
4793    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4794  os().SetCurrentInstruction(kVfma, kFpNeon);
4795  os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4796       << rd << ", " << rn << ", " << rm;
4797}
4798
4799void Disassembler::vfma(
4800    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4801  os().SetCurrentInstruction(kVfma, kFpNeon);
4802  os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4803       << rd << ", " << rn << ", " << rm;
4804}
4805
4806void Disassembler::vfms(
4807    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4808  os().SetCurrentInstruction(kVfms, kFpNeon);
4809  os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4810       << rd << ", " << rn << ", " << rm;
4811}
4812
4813void Disassembler::vfms(
4814    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4815  os().SetCurrentInstruction(kVfms, kFpNeon);
4816  os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4817       << rd << ", " << rn << ", " << rm;
4818}
4819
4820void Disassembler::vfms(
4821    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4822  os().SetCurrentInstruction(kVfms, kFpNeon);
4823  os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4824       << rd << ", " << rn << ", " << rm;
4825}
4826
4827void Disassembler::vfnma(
4828    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4829  os().SetCurrentInstruction(kVfnma, kFpNeon);
4830  os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
4831       << rd << ", " << rn << ", " << rm;
4832}
4833
4834void Disassembler::vfnma(
4835    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4836  os().SetCurrentInstruction(kVfnma, kFpNeon);
4837  os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
4838       << rd << ", " << rn << ", " << rm;
4839}
4840
4841void Disassembler::vfnms(
4842    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4843  os().SetCurrentInstruction(kVfnms, kFpNeon);
4844  os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
4845       << rd << ", " << rn << ", " << rm;
4846}
4847
4848void Disassembler::vfnms(
4849    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4850  os().SetCurrentInstruction(kVfnms, kFpNeon);
4851  os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
4852       << rd << ", " << rn << ", " << rm;
4853}
4854
4855void Disassembler::vhadd(
4856    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4857  os().SetCurrentInstruction(kVhadd, kFpNeon);
4858  os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
4859  os() << " ";
4860  if (!rd.Is(rn) || !use_short_hand_form_) {
4861    os() << rd << ", ";
4862  }
4863  os() << rn << ", " << rm;
4864}
4865
4866void Disassembler::vhadd(
4867    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4868  os().SetCurrentInstruction(kVhadd, kFpNeon);
4869  os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
4870  os() << " ";
4871  if (!rd.Is(rn) || !use_short_hand_form_) {
4872    os() << rd << ", ";
4873  }
4874  os() << rn << ", " << rm;
4875}
4876
4877void Disassembler::vhsub(
4878    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4879  os().SetCurrentInstruction(kVhsub, kFpNeon);
4880  os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
4881  os() << " ";
4882  if (!rd.Is(rn) || !use_short_hand_form_) {
4883    os() << rd << ", ";
4884  }
4885  os() << rn << ", " << rm;
4886}
4887
4888void Disassembler::vhsub(
4889    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4890  os().SetCurrentInstruction(kVhsub, kFpNeon);
4891  os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
4892  os() << " ";
4893  if (!rd.Is(rn) || !use_short_hand_form_) {
4894    os() << rd << ", ";
4895  }
4896  os() << rn << ", " << rm;
4897}
4898
4899void Disassembler::vld1(Condition cond,
4900                        DataType dt,
4901                        const NeonRegisterList& nreglist,
4902                        const AlignedMemOperand& operand) {
4903  os().SetCurrentInstruction(kVld1, kFpNeon);
4904  os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " "
4905       << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand);
4906}
4907
4908void Disassembler::vld2(Condition cond,
4909                        DataType dt,
4910                        const NeonRegisterList& nreglist,
4911                        const AlignedMemOperand& operand) {
4912  os().SetCurrentInstruction(kVld2, kFpNeon);
4913  os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " "
4914       << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand);
4915}
4916
4917void Disassembler::vld3(Condition cond,
4918                        DataType dt,
4919                        const NeonRegisterList& nreglist,
4920                        const AlignedMemOperand& operand) {
4921  os().SetCurrentInstruction(kVld3, kFpNeon);
4922  os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
4923       << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand);
4924}
4925
4926void Disassembler::vld3(Condition cond,
4927                        DataType dt,
4928                        const NeonRegisterList& nreglist,
4929                        const MemOperand& operand) {
4930  os().SetCurrentInstruction(kVld3, kFpNeon);
4931  os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
4932       << nreglist << ", " << PrintMemOperand(kVld3Location, operand);
4933}
4934
4935void Disassembler::vld4(Condition cond,
4936                        DataType dt,
4937                        const NeonRegisterList& nreglist,
4938                        const AlignedMemOperand& operand) {
4939  os().SetCurrentInstruction(kVld4, kFpNeon);
4940  os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " "
4941       << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand);
4942}
4943
4944void Disassembler::vldm(Condition cond,
4945                        DataType dt,
4946                        Register rn,
4947                        WriteBack write_back,
4948                        DRegisterList dreglist) {
4949  os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
4950  os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
4951       << rn << write_back << ", " << dreglist;
4952}
4953
4954void Disassembler::vldm(Condition cond,
4955                        DataType dt,
4956                        Register rn,
4957                        WriteBack write_back,
4958                        SRegisterList sreglist) {
4959  os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
4960  os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
4961       << rn << write_back << ", " << sreglist;
4962}
4963
4964void Disassembler::vldmdb(Condition cond,
4965                          DataType dt,
4966                          Register rn,
4967                          WriteBack write_back,
4968                          DRegisterList dreglist) {
4969  os().SetCurrentInstruction(kVldmdb,
4970                             kLoadStore | kLoadStoreMultiple | kFpNeon);
4971  os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
4972       << rn << write_back << ", " << dreglist;
4973}
4974
4975void Disassembler::vldmdb(Condition cond,
4976                          DataType dt,
4977                          Register rn,
4978                          WriteBack write_back,
4979                          SRegisterList sreglist) {
4980  os().SetCurrentInstruction(kVldmdb,
4981                             kLoadStore | kLoadStoreMultiple | kFpNeon);
4982  os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
4983       << rn << write_back << ", " << sreglist;
4984}
4985
4986void Disassembler::vldmia(Condition cond,
4987                          DataType dt,
4988                          Register rn,
4989                          WriteBack write_back,
4990                          DRegisterList dreglist) {
4991  os().SetCurrentInstruction(kVldmia,
4992                             kLoadStore | kLoadStoreMultiple | kFpNeon);
4993  os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
4994       << rn << write_back << ", " << dreglist;
4995}
4996
4997void Disassembler::vldmia(Condition cond,
4998                          DataType dt,
4999                          Register rn,
5000                          WriteBack write_back,
5001                          SRegisterList sreglist) {
5002  os().SetCurrentInstruction(kVldmia,
5003                             kLoadStore | kLoadStoreMultiple | kFpNeon);
5004  os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
5005       << rn << write_back << ", " << sreglist;
5006}
5007
5008void Disassembler::vldr(Condition cond,
5009                        DataType dt,
5010                        DRegister rd,
5011                        Location* location) {
5012  os().SetCurrentInstruction(kVldr, kFpNeon);
5013  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5014       << DtPrinter(dt, Untyped64) << " " << rd << ", "
5015       << PrintLabel(kLoadDoublePrecisionLocation,
5016                     location,
5017                     GetCodeAddress() & ~3);
5018}
5019
5020void Disassembler::vldr(Condition cond,
5021                        DataType dt,
5022                        DRegister rd,
5023                        const MemOperand& operand) {
5024  os().SetCurrentInstruction(kVldr, kFpNeon);
5025  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5026       << DtPrinter(dt, Untyped64) << " " << rd << ", "
5027       << PrintMemOperand(kLoadDoublePrecisionLocation, operand);
5028}
5029
5030void Disassembler::vldr(Condition cond,
5031                        DataType dt,
5032                        SRegister rd,
5033                        Location* location) {
5034  os().SetCurrentInstruction(kVldr, kFpNeon);
5035  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5036       << DtPrinter(dt, Untyped32) << " " << rd << ", "
5037       << PrintLabel(kLoadSinglePrecisionLocation,
5038                     location,
5039                     GetCodeAddress() & ~3);
5040}
5041
5042void Disassembler::vldr(Condition cond,
5043                        DataType dt,
5044                        SRegister rd,
5045                        const MemOperand& operand) {
5046  os().SetCurrentInstruction(kVldr, kFpNeon);
5047  os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
5048       << DtPrinter(dt, Untyped32) << " " << rd << ", "
5049       << PrintMemOperand(kLoadSinglePrecisionLocation, operand);
5050}
5051
5052void Disassembler::vmax(
5053    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5054  os().SetCurrentInstruction(kVmax, kFpNeon);
5055  os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
5056  os() << " ";
5057  if (!rd.Is(rn) || !use_short_hand_form_) {
5058    os() << rd << ", ";
5059  }
5060  os() << rn << ", " << rm;
5061}
5062
5063void Disassembler::vmax(
5064    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5065  os().SetCurrentInstruction(kVmax, kFpNeon);
5066  os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
5067  os() << " ";
5068  if (!rd.Is(rn) || !use_short_hand_form_) {
5069    os() << rd << ", ";
5070  }
5071  os() << rn << ", " << rm;
5072}
5073
5074void Disassembler::vmaxnm(DataType dt,
5075                          DRegister rd,
5076                          DRegister rn,
5077                          DRegister rm) {
5078  os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5079  os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5080}
5081
5082void Disassembler::vmaxnm(DataType dt,
5083                          QRegister rd,
5084                          QRegister rn,
5085                          QRegister rm) {
5086  os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5087  os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5088}
5089
5090void Disassembler::vmaxnm(DataType dt,
5091                          SRegister rd,
5092                          SRegister rn,
5093                          SRegister rm) {
5094  os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5095  os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5096}
5097
5098void Disassembler::vmin(
5099    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5100  os().SetCurrentInstruction(kVmin, kFpNeon);
5101  os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
5102  os() << " ";
5103  if (!rd.Is(rn) || !use_short_hand_form_) {
5104    os() << rd << ", ";
5105  }
5106  os() << rn << ", " << rm;
5107}
5108
5109void Disassembler::vmin(
5110    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5111  os().SetCurrentInstruction(kVmin, kFpNeon);
5112  os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
5113  os() << " ";
5114  if (!rd.Is(rn) || !use_short_hand_form_) {
5115    os() << rd << ", ";
5116  }
5117  os() << rn << ", " << rm;
5118}
5119
5120void Disassembler::vminnm(DataType dt,
5121                          DRegister rd,
5122                          DRegister rn,
5123                          DRegister rm) {
5124  os().SetCurrentInstruction(kVminnm, kFpNeon);
5125  os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5126}
5127
5128void Disassembler::vminnm(DataType dt,
5129                          QRegister rd,
5130                          QRegister rn,
5131                          QRegister rm) {
5132  os().SetCurrentInstruction(kVminnm, kFpNeon);
5133  os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5134}
5135
5136void Disassembler::vminnm(DataType dt,
5137                          SRegister rd,
5138                          SRegister rn,
5139                          SRegister rm) {
5140  os().SetCurrentInstruction(kVminnm, kFpNeon);
5141  os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5142}
5143
5144void Disassembler::vmla(
5145    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5146  os().SetCurrentInstruction(kVmla, kFpNeon);
5147  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5148       << rd << ", " << rn << ", " << rm;
5149}
5150
5151void Disassembler::vmla(
5152    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5153  os().SetCurrentInstruction(kVmla, kFpNeon);
5154  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5155       << rd << ", " << rn << ", " << rm;
5156}
5157
5158void Disassembler::vmla(
5159    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5160  os().SetCurrentInstruction(kVmla, kFpNeon);
5161  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5162       << rd << ", " << rn << ", " << rm;
5163}
5164
5165void Disassembler::vmla(
5166    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5167  os().SetCurrentInstruction(kVmla, kFpNeon);
5168  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5169       << rd << ", " << rn << ", " << rm;
5170}
5171
5172void Disassembler::vmla(
5173    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5174  os().SetCurrentInstruction(kVmla, kFpNeon);
5175  os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5176       << rd << ", " << rn << ", " << rm;
5177}
5178
5179void Disassembler::vmlal(
5180    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5181  os().SetCurrentInstruction(kVmlal, kFpNeon);
5182  os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5183       << rd << ", " << rn << ", " << rm;
5184}
5185
5186void Disassembler::vmlal(
5187    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5188  os().SetCurrentInstruction(kVmlal, kFpNeon);
5189  os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5190       << rd << ", " << rn << ", " << rm;
5191}
5192
5193void Disassembler::vmls(
5194    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5195  os().SetCurrentInstruction(kVmls, kFpNeon);
5196  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5197       << rd << ", " << rn << ", " << rm;
5198}
5199
5200void Disassembler::vmls(
5201    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5202  os().SetCurrentInstruction(kVmls, kFpNeon);
5203  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5204       << rd << ", " << rn << ", " << rm;
5205}
5206
5207void Disassembler::vmls(
5208    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5209  os().SetCurrentInstruction(kVmls, kFpNeon);
5210  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5211       << rd << ", " << rn << ", " << rm;
5212}
5213
5214void Disassembler::vmls(
5215    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5216  os().SetCurrentInstruction(kVmls, kFpNeon);
5217  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5218       << rd << ", " << rn << ", " << rm;
5219}
5220
5221void Disassembler::vmls(
5222    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5223  os().SetCurrentInstruction(kVmls, kFpNeon);
5224  os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5225       << rd << ", " << rn << ", " << rm;
5226}
5227
5228void Disassembler::vmlsl(
5229    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5230  os().SetCurrentInstruction(kVmlsl, kFpNeon);
5231  os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5232       << rd << ", " << rn << ", " << rm;
5233}
5234
5235void Disassembler::vmlsl(
5236    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5237  os().SetCurrentInstruction(kVmlsl, kFpNeon);
5238  os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5239       << rd << ", " << rn << ", " << rm;
5240}
5241
5242void Disassembler::vmov(Condition cond, Register rt, SRegister rn) {
5243  os().SetCurrentInstruction(kVmov, kFpNeon);
5244  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5245       << ", " << rn;
5246}
5247
5248void Disassembler::vmov(Condition cond, SRegister rn, Register rt) {
5249  os().SetCurrentInstruction(kVmov, kFpNeon);
5250  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn
5251       << ", " << rt;
5252}
5253
5254void Disassembler::vmov(Condition cond,
5255                        Register rt,
5256                        Register rt2,
5257                        DRegister rm) {
5258  os().SetCurrentInstruction(kVmov, kFpNeon);
5259  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5260       << ", " << rt2 << ", " << rm;
5261}
5262
5263void Disassembler::vmov(Condition cond,
5264                        DRegister rm,
5265                        Register rt,
5266                        Register rt2) {
5267  os().SetCurrentInstruction(kVmov, kFpNeon);
5268  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
5269       << ", " << rt << ", " << rt2;
5270}
5271
5272void Disassembler::vmov(
5273    Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
5274  os().SetCurrentInstruction(kVmov, kFpNeon);
5275  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5276       << ", " << rt2 << ", " << rm << ", " << rm1;
5277}
5278
5279void Disassembler::vmov(
5280    Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
5281  os().SetCurrentInstruction(kVmov, kFpNeon);
5282  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
5283       << ", " << rm1 << ", " << rt << ", " << rt2;
5284}
5285
5286void Disassembler::vmov(Condition cond,
5287                        DataType dt,
5288                        DRegisterLane rd,
5289                        Register rt) {
5290  os().SetCurrentInstruction(kVmov, kFpNeon);
5291  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5292       << rd << ", " << rt;
5293}
5294
5295void Disassembler::vmov(Condition cond,
5296                        DataType dt,
5297                        DRegister rd,
5298                        const DOperand& operand) {
5299  os().SetCurrentInstruction(kVmov, kFpNeon);
5300  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5301       << rd << ", " << operand;
5302}
5303
5304void Disassembler::vmov(Condition cond,
5305                        DataType dt,
5306                        QRegister rd,
5307                        const QOperand& operand) {
5308  os().SetCurrentInstruction(kVmov, kFpNeon);
5309  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5310       << rd << ", " << operand;
5311}
5312
5313void Disassembler::vmov(Condition cond,
5314                        DataType dt,
5315                        SRegister rd,
5316                        const SOperand& operand) {
5317  os().SetCurrentInstruction(kVmov, kFpNeon);
5318  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5319       << rd << ", " << operand;
5320}
5321
5322void Disassembler::vmov(Condition cond,
5323                        DataType dt,
5324                        Register rt,
5325                        DRegisterLane rn) {
5326  os().SetCurrentInstruction(kVmov, kFpNeon);
5327  os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5328       << rt << ", " << rn;
5329}
5330
5331void Disassembler::vmovl(Condition cond,
5332                         DataType dt,
5333                         QRegister rd,
5334                         DRegister rm) {
5335  os().SetCurrentInstruction(kVmovl, kFpNeon);
5336  os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " "
5337       << rd << ", " << rm;
5338}
5339
5340void Disassembler::vmovn(Condition cond,
5341                         DataType dt,
5342                         DRegister rd,
5343                         QRegister rm) {
5344  os().SetCurrentInstruction(kVmovn, kFpNeon);
5345  os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " "
5346       << rd << ", " << rm;
5347}
5348
5349void Disassembler::vmrs(Condition cond,
5350                        RegisterOrAPSR_nzcv rt,
5351                        SpecialFPRegister spec_reg) {
5352  os().SetCurrentInstruction(kVmrs, kFpNeon);
5353  os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt
5354       << ", " << spec_reg;
5355}
5356
5357void Disassembler::vmsr(Condition cond,
5358                        SpecialFPRegister spec_reg,
5359                        Register rt) {
5360  os().SetCurrentInstruction(kVmsr, kFpNeon);
5361  os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " "
5362       << spec_reg << ", " << rt;
5363}
5364
5365void Disassembler::vmul(Condition cond,
5366                        DataType dt,
5367                        DRegister rd,
5368                        DRegister rn,
5369                        DRegister dm,
5370                        unsigned index) {
5371  os().SetCurrentInstruction(kVmul, kFpNeon);
5372  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5373  os() << " ";
5374  if (!rd.Is(rn) || !use_short_hand_form_) {
5375    os() << rd << ", ";
5376  }
5377  os() << rn << ", " << IndexedRegisterPrinter(dm, index);
5378}
5379
5380void Disassembler::vmul(Condition cond,
5381                        DataType dt,
5382                        QRegister rd,
5383                        QRegister rn,
5384                        DRegister dm,
5385                        unsigned index) {
5386  os().SetCurrentInstruction(kVmul, kFpNeon);
5387  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5388  os() << " ";
5389  if (!rd.Is(rn) || !use_short_hand_form_) {
5390    os() << rd << ", ";
5391  }
5392  os() << rn << ", " << IndexedRegisterPrinter(dm, index);
5393}
5394
5395void Disassembler::vmul(
5396    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5397  os().SetCurrentInstruction(kVmul, kFpNeon);
5398  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5399  os() << " ";
5400  if (!rd.Is(rn) || !use_short_hand_form_) {
5401    os() << rd << ", ";
5402  }
5403  os() << rn << ", " << rm;
5404}
5405
5406void Disassembler::vmul(
5407    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5408  os().SetCurrentInstruction(kVmul, kFpNeon);
5409  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5410  os() << " ";
5411  if (!rd.Is(rn) || !use_short_hand_form_) {
5412    os() << rd << ", ";
5413  }
5414  os() << rn << ", " << rm;
5415}
5416
5417void Disassembler::vmul(
5418    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5419  os().SetCurrentInstruction(kVmul, kFpNeon);
5420  os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5421  os() << " ";
5422  if (!rd.Is(rn) || !use_short_hand_form_) {
5423    os() << rd << ", ";
5424  }
5425  os() << rn << ", " << rm;
5426}
5427
5428void Disassembler::vmull(Condition cond,
5429                         DataType dt,
5430                         QRegister rd,
5431                         DRegister rn,
5432                         DRegister dm,
5433                         unsigned index) {
5434  os().SetCurrentInstruction(kVmull, kFpNeon);
5435  os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
5436       << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
5437}
5438
5439void Disassembler::vmull(
5440    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5441  os().SetCurrentInstruction(kVmull, kFpNeon);
5442  os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
5443       << rd << ", " << rn << ", " << rm;
5444}
5445
5446void Disassembler::vmvn(Condition cond,
5447                        DataType dt,
5448                        DRegister rd,
5449                        const DOperand& operand) {
5450  os().SetCurrentInstruction(kVmvn, kFpNeon);
5451  os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
5452       << rd << ", " << operand;
5453}
5454
5455void Disassembler::vmvn(Condition cond,
5456                        DataType dt,
5457                        QRegister rd,
5458                        const QOperand& operand) {
5459  os().SetCurrentInstruction(kVmvn, kFpNeon);
5460  os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
5461       << rd << ", " << operand;
5462}
5463
5464void Disassembler::vneg(Condition cond,
5465                        DataType dt,
5466                        DRegister rd,
5467                        DRegister rm) {
5468  os().SetCurrentInstruction(kVneg, kFpNeon);
5469  os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5470       << rd << ", " << rm;
5471}
5472
5473void Disassembler::vneg(Condition cond,
5474                        DataType dt,
5475                        QRegister rd,
5476                        QRegister rm) {
5477  os().SetCurrentInstruction(kVneg, kFpNeon);
5478  os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5479       << rd << ", " << rm;
5480}
5481
5482void Disassembler::vneg(Condition cond,
5483                        DataType dt,
5484                        SRegister rd,
5485                        SRegister rm) {
5486  os().SetCurrentInstruction(kVneg, kFpNeon);
5487  os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5488       << rd << ", " << rm;
5489}
5490
5491void Disassembler::vnmla(
5492    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5493  os().SetCurrentInstruction(kVnmla, kFpNeon);
5494  os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
5495       << rd << ", " << rn << ", " << rm;
5496}
5497
5498void Disassembler::vnmla(
5499    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5500  os().SetCurrentInstruction(kVnmla, kFpNeon);
5501  os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
5502       << rd << ", " << rn << ", " << rm;
5503}
5504
5505void Disassembler::vnmls(
5506    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5507  os().SetCurrentInstruction(kVnmls, kFpNeon);
5508  os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
5509       << rd << ", " << rn << ", " << rm;
5510}
5511
5512void Disassembler::vnmls(
5513    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5514  os().SetCurrentInstruction(kVnmls, kFpNeon);
5515  os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
5516       << rd << ", " << rn << ", " << rm;
5517}
5518
5519void Disassembler::vnmul(
5520    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5521  os().SetCurrentInstruction(kVnmul, kFpNeon);
5522  os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
5523  os() << " ";
5524  if (!rd.Is(rn) || !use_short_hand_form_) {
5525    os() << rd << ", ";
5526  }
5527  os() << rn << ", " << rm;
5528}
5529
5530void Disassembler::vnmul(
5531    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5532  os().SetCurrentInstruction(kVnmul, kFpNeon);
5533  os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
5534  os() << " ";
5535  if (!rd.Is(rn) || !use_short_hand_form_) {
5536    os() << rd << ", ";
5537  }
5538  os() << rn << ", " << rm;
5539}
5540
5541void Disassembler::vorn(Condition cond,
5542                        DataType dt,
5543                        DRegister rd,
5544                        DRegister rn,
5545                        const DOperand& operand) {
5546  os().SetCurrentInstruction(kVorn, kFpNeon);
5547  os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
5548  os() << " ";
5549  if (!rd.Is(rn) || !use_short_hand_form_) {
5550    os() << rd << ", ";
5551  }
5552  os() << rn << ", " << operand;
5553}
5554
5555void Disassembler::vorn(Condition cond,
5556                        DataType dt,
5557                        QRegister rd,
5558                        QRegister rn,
5559                        const QOperand& operand) {
5560  os().SetCurrentInstruction(kVorn, kFpNeon);
5561  os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
5562  os() << " ";
5563  if (!rd.Is(rn) || !use_short_hand_form_) {
5564    os() << rd << ", ";
5565  }
5566  os() << rn << ", " << operand;
5567}
5568
5569void Disassembler::vorr(Condition cond,
5570                        DataType dt,
5571                        DRegister rd,
5572                        DRegister rn,
5573                        const DOperand& operand) {
5574  os().SetCurrentInstruction(kVorr, kFpNeon);
5575  os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
5576  os() << " ";
5577  if (!rd.Is(rn) || !use_short_hand_form_) {
5578    os() << rd << ", ";
5579  }
5580  os() << rn << ", " << operand;
5581}
5582
5583void Disassembler::vorr(Condition cond,
5584                        DataType dt,
5585                        QRegister rd,
5586                        QRegister rn,
5587                        const QOperand& operand) {
5588  os().SetCurrentInstruction(kVorr, kFpNeon);
5589  os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
5590  os() << " ";
5591  if (!rd.Is(rn) || !use_short_hand_form_) {
5592    os() << rd << ", ";
5593  }
5594  os() << rn << ", " << operand;
5595}
5596
5597void Disassembler::vpadal(Condition cond,
5598                          DataType dt,
5599                          DRegister rd,
5600                          DRegister rm) {
5601  os().SetCurrentInstruction(kVpadal, kFpNeon);
5602  os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
5603       << rd << ", " << rm;
5604}
5605
5606void Disassembler::vpadal(Condition cond,
5607                          DataType dt,
5608                          QRegister rd,
5609                          QRegister rm) {
5610  os().SetCurrentInstruction(kVpadal, kFpNeon);
5611  os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
5612       << rd << ", " << rm;
5613}
5614
5615void Disassembler::vpadd(
5616    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5617  os().SetCurrentInstruction(kVpadd, kFpNeon);
5618  os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt;
5619  os() << " ";
5620  if (!rd.Is(rn) || !use_short_hand_form_) {
5621    os() << rd << ", ";
5622  }
5623  os() << rn << ", " << rm;
5624}
5625
5626void Disassembler::vpaddl(Condition cond,
5627                          DataType dt,
5628                          DRegister rd,
5629                          DRegister rm) {
5630  os().SetCurrentInstruction(kVpaddl, kFpNeon);
5631  os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
5632       << rd << ", " << rm;
5633}
5634
5635void Disassembler::vpaddl(Condition cond,
5636                          DataType dt,
5637                          QRegister rd,
5638                          QRegister rm) {
5639  os().SetCurrentInstruction(kVpaddl, kFpNeon);
5640  os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
5641       << rd << ", " << rm;
5642}
5643
5644void Disassembler::vpmax(
5645    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5646  os().SetCurrentInstruction(kVpmax, kFpNeon);
5647  os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt;
5648  os() << " ";
5649  if (!rd.Is(rn) || !use_short_hand_form_) {
5650    os() << rd << ", ";
5651  }
5652  os() << rn << ", " << rm;
5653}
5654
5655void Disassembler::vpmin(
5656    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5657  os().SetCurrentInstruction(kVpmin, kFpNeon);
5658  os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt;
5659  os() << " ";
5660  if (!rd.Is(rn) || !use_short_hand_form_) {
5661    os() << rd << ", ";
5662  }
5663  os() << rn << ", " << rm;
5664}
5665
5666void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) {
5667  os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
5668  os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
5669       << dreglist;
5670}
5671
5672void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) {
5673  os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
5674  os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
5675       << sreglist;
5676}
5677
5678void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) {
5679  os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
5680  os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
5681       << dreglist;
5682}
5683
5684void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) {
5685  os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
5686  os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
5687       << sreglist;
5688}
5689
5690void Disassembler::vqabs(Condition cond,
5691                         DataType dt,
5692                         DRegister rd,
5693                         DRegister rm) {
5694  os().SetCurrentInstruction(kVqabs, kFpNeon);
5695  os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
5696       << rd << ", " << rm;
5697}
5698
5699void Disassembler::vqabs(Condition cond,
5700                         DataType dt,
5701                         QRegister rd,
5702                         QRegister rm) {
5703  os().SetCurrentInstruction(kVqabs, kFpNeon);
5704  os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
5705       << rd << ", " << rm;
5706}
5707
5708void Disassembler::vqadd(
5709    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5710  os().SetCurrentInstruction(kVqadd, kFpNeon);
5711  os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
5712  os() << " ";
5713  if (!rd.Is(rn) || !use_short_hand_form_) {
5714    os() << rd << ", ";
5715  }
5716  os() << rn << ", " << rm;
5717}
5718
5719void Disassembler::vqadd(
5720    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5721  os().SetCurrentInstruction(kVqadd, kFpNeon);
5722  os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
5723  os() << " ";
5724  if (!rd.Is(rn) || !use_short_hand_form_) {
5725    os() << rd << ", ";
5726  }
5727  os() << rn << ", " << rm;
5728}
5729
5730void Disassembler::vqdmlal(
5731    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5732  os().SetCurrentInstruction(kVqdmlal, kFpNeon);
5733  os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5734       << rd << ", " << rn << ", " << rm;
5735}
5736
5737void Disassembler::vqdmlal(Condition cond,
5738                           DataType dt,
5739                           QRegister rd,
5740                           DRegister rn,
5741                           DRegister dm,
5742                           unsigned index) {
5743  os().SetCurrentInstruction(kVqdmlal, kFpNeon);
5744  os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5745       << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
5746}
5747
5748void Disassembler::vqdmlsl(
5749    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5750  os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
5751  os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5752       << rd << ", " << rn << ", " << rm;
5753}
5754
5755void Disassembler::vqdmlsl(Condition cond,
5756                           DataType dt,
5757                           QRegister rd,
5758                           DRegister rn,
5759                           DRegister dm,
5760                           unsigned index) {
5761  os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
5762  os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5763       << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
5764}
5765
5766void Disassembler::vqdmulh(
5767    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5768  os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5769  os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5770  os() << " ";
5771  if (!rd.Is(rn) || !use_short_hand_form_) {
5772    os() << rd << ", ";
5773  }
5774  os() << rn << ", " << rm;
5775}
5776
5777void Disassembler::vqdmulh(
5778    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5779  os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5780  os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5781  os() << " ";
5782  if (!rd.Is(rn) || !use_short_hand_form_) {
5783    os() << rd << ", ";
5784  }
5785  os() << rn << ", " << rm;
5786}
5787
5788void Disassembler::vqdmulh(
5789    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5790  os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5791  os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5792  os() << " ";
5793  if (!rd.Is(rn) || !use_short_hand_form_) {
5794    os() << rd << ", ";
5795  }
5796  os() << rn << ", " << rm;
5797}
5798
5799void Disassembler::vqdmulh(
5800    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5801  os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5802  os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5803  os() << " ";
5804  if (!rd.Is(rn) || !use_short_hand_form_) {
5805    os() << rd << ", ";
5806  }
5807  os() << rn << ", " << rm;
5808}
5809
5810void Disassembler::vqdmull(
5811    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5812  os().SetCurrentInstruction(kVqdmull, kFpNeon);
5813  os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
5814       << rd << ", " << rn << ", " << rm;
5815}
5816
5817void Disassembler::vqdmull(
5818    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5819  os().SetCurrentInstruction(kVqdmull, kFpNeon);
5820  os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
5821       << rd << ", " << rn << ", " << rm;
5822}
5823
5824void Disassembler::vqmovn(Condition cond,
5825                          DataType dt,
5826                          DRegister rd,
5827                          QRegister rm) {
5828  os().SetCurrentInstruction(kVqmovn, kFpNeon);
5829  os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " "
5830       << rd << ", " << rm;
5831}
5832
5833void Disassembler::vqmovun(Condition cond,
5834                           DataType dt,
5835                           DRegister rd,
5836                           QRegister rm) {
5837  os().SetCurrentInstruction(kVqmovun, kFpNeon);
5838  os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " "
5839       << rd << ", " << rm;
5840}
5841
5842void Disassembler::vqneg(Condition cond,
5843                         DataType dt,
5844                         DRegister rd,
5845                         DRegister rm) {
5846  os().SetCurrentInstruction(kVqneg, kFpNeon);
5847  os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
5848       << rd << ", " << rm;
5849}
5850
5851void Disassembler::vqneg(Condition cond,
5852                         DataType dt,
5853                         QRegister rd,
5854                         QRegister rm) {
5855  os().SetCurrentInstruction(kVqneg, kFpNeon);
5856  os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
5857       << rd << ", " << rm;
5858}
5859
5860void Disassembler::vqrdmulh(
5861    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5862  os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5863  os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5864  os() << " ";
5865  if (!rd.Is(rn) || !use_short_hand_form_) {
5866    os() << rd << ", ";
5867  }
5868  os() << rn << ", " << rm;
5869}
5870
5871void Disassembler::vqrdmulh(
5872    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5873  os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5874  os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5875  os() << " ";
5876  if (!rd.Is(rn) || !use_short_hand_form_) {
5877    os() << rd << ", ";
5878  }
5879  os() << rn << ", " << rm;
5880}
5881
5882void Disassembler::vqrdmulh(
5883    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5884  os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5885  os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5886  os() << " ";
5887  if (!rd.Is(rn) || !use_short_hand_form_) {
5888    os() << rd << ", ";
5889  }
5890  os() << rn << ", " << rm;
5891}
5892
5893void Disassembler::vqrdmulh(
5894    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5895  os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5896  os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5897  os() << " ";
5898  if (!rd.Is(rn) || !use_short_hand_form_) {
5899    os() << rd << ", ";
5900  }
5901  os() << rn << ", " << rm;
5902}
5903
5904void Disassembler::vqrshl(
5905    Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
5906  os().SetCurrentInstruction(kVqrshl, kFpNeon);
5907  os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
5908  os() << " ";
5909  if (!rd.Is(rm) || !use_short_hand_form_) {
5910    os() << rd << ", ";
5911  }
5912  os() << rm << ", " << rn;
5913}
5914
5915void Disassembler::vqrshl(
5916    Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
5917  os().SetCurrentInstruction(kVqrshl, kFpNeon);
5918  os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
5919  os() << " ";
5920  if (!rd.Is(rm) || !use_short_hand_form_) {
5921    os() << rd << ", ";
5922  }
5923  os() << rm << ", " << rn;
5924}
5925
5926void Disassembler::vqrshrn(Condition cond,
5927                           DataType dt,
5928                           DRegister rd,
5929                           QRegister rm,
5930                           const QOperand& operand) {
5931  os().SetCurrentInstruction(kVqrshrn, kFpNeon);
5932  os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
5933       << rd << ", " << rm << ", " << operand;
5934}
5935
5936void Disassembler::vqrshrun(Condition cond,
5937                            DataType dt,
5938                            DRegister rd,
5939                            QRegister rm,
5940                            const QOperand& operand) {
5941  os().SetCurrentInstruction(kVqrshrun, kFpNeon);
5942  os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " "
5943       << rd << ", " << rm << ", " << operand;
5944}
5945
5946void Disassembler::vqshl(Condition cond,
5947                         DataType dt,
5948                         DRegister rd,
5949                         DRegister rm,
5950                         const DOperand& operand) {
5951  os().SetCurrentInstruction(kVqshl, kFpNeon);
5952  os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
5953  os() << " ";
5954  if (!rd.Is(rm) || !use_short_hand_form_) {
5955    os() << rd << ", ";
5956  }
5957  os() << rm << ", " << operand;
5958}
5959
5960void Disassembler::vqshl(Condition cond,
5961                         DataType dt,
5962                         QRegister rd,
5963                         QRegister rm,
5964                         const QOperand& operand) {
5965  os().SetCurrentInstruction(kVqshl, kFpNeon);
5966  os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
5967  os() << " ";
5968  if (!rd.Is(rm) || !use_short_hand_form_) {
5969    os() << rd << ", ";
5970  }
5971  os() << rm << ", " << operand;
5972}
5973
5974void Disassembler::vqshlu(Condition cond,
5975                          DataType dt,
5976                          DRegister rd,
5977                          DRegister rm,
5978                          const DOperand& operand) {
5979  os().SetCurrentInstruction(kVqshlu, kFpNeon);
5980  os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
5981  os() << " ";
5982  if (!rd.Is(rm) || !use_short_hand_form_) {
5983    os() << rd << ", ";
5984  }
5985  os() << rm << ", " << operand;
5986}
5987
5988void Disassembler::vqshlu(Condition cond,
5989                          DataType dt,
5990                          QRegister rd,
5991                          QRegister rm,
5992                          const QOperand& operand) {
5993  os().SetCurrentInstruction(kVqshlu, kFpNeon);
5994  os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
5995  os() << " ";
5996  if (!rd.Is(rm) || !use_short_hand_form_) {
5997    os() << rd << ", ";
5998  }
5999  os() << rm << ", " << operand;
6000}
6001
6002void Disassembler::vqshrn(Condition cond,
6003                          DataType dt,
6004                          DRegister rd,
6005                          QRegister rm,
6006                          const QOperand& operand) {
6007  os().SetCurrentInstruction(kVqshrn, kFpNeon);
6008  os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6009       << rd << ", " << rm << ", " << operand;
6010}
6011
6012void Disassembler::vqshrun(Condition cond,
6013                           DataType dt,
6014                           DRegister rd,
6015                           QRegister rm,
6016                           const QOperand& operand) {
6017  os().SetCurrentInstruction(kVqshrun, kFpNeon);
6018  os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " "
6019       << rd << ", " << rm << ", " << operand;
6020}
6021
6022void Disassembler::vqsub(
6023    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6024  os().SetCurrentInstruction(kVqsub, kFpNeon);
6025  os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
6026  os() << " ";
6027  if (!rd.Is(rn) || !use_short_hand_form_) {
6028    os() << rd << ", ";
6029  }
6030  os() << rn << ", " << rm;
6031}
6032
6033void Disassembler::vqsub(
6034    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6035  os().SetCurrentInstruction(kVqsub, kFpNeon);
6036  os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
6037  os() << " ";
6038  if (!rd.Is(rn) || !use_short_hand_form_) {
6039    os() << rd << ", ";
6040  }
6041  os() << rn << ", " << rm;
6042}
6043
6044void Disassembler::vraddhn(
6045    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6046  os().SetCurrentInstruction(kVraddhn, kFpNeon);
6047  os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " "
6048       << rd << ", " << rn << ", " << rm;
6049}
6050
6051void Disassembler::vrecpe(Condition cond,
6052                          DataType dt,
6053                          DRegister rd,
6054                          DRegister rm) {
6055  os().SetCurrentInstruction(kVrecpe, kFpNeon);
6056  os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
6057       << rd << ", " << rm;
6058}
6059
6060void Disassembler::vrecpe(Condition cond,
6061                          DataType dt,
6062                          QRegister rd,
6063                          QRegister rm) {
6064  os().SetCurrentInstruction(kVrecpe, kFpNeon);
6065  os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
6066       << rd << ", " << rm;
6067}
6068
6069void Disassembler::vrecps(
6070    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6071  os().SetCurrentInstruction(kVrecps, kFpNeon);
6072  os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
6073  os() << " ";
6074  if (!rd.Is(rn) || !use_short_hand_form_) {
6075    os() << rd << ", ";
6076  }
6077  os() << rn << ", " << rm;
6078}
6079
6080void Disassembler::vrecps(
6081    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6082  os().SetCurrentInstruction(kVrecps, kFpNeon);
6083  os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
6084  os() << " ";
6085  if (!rd.Is(rn) || !use_short_hand_form_) {
6086    os() << rd << ", ";
6087  }
6088  os() << rn << ", " << rm;
6089}
6090
6091void Disassembler::vrev16(Condition cond,
6092                          DataType dt,
6093                          DRegister rd,
6094                          DRegister rm) {
6095  os().SetCurrentInstruction(kVrev16, kFpNeon);
6096  os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
6097       << rd << ", " << rm;
6098}
6099
6100void Disassembler::vrev16(Condition cond,
6101                          DataType dt,
6102                          QRegister rd,
6103                          QRegister rm) {
6104  os().SetCurrentInstruction(kVrev16, kFpNeon);
6105  os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
6106       << rd << ", " << rm;
6107}
6108
6109void Disassembler::vrev32(Condition cond,
6110                          DataType dt,
6111                          DRegister rd,
6112                          DRegister rm) {
6113  os().SetCurrentInstruction(kVrev32, kFpNeon);
6114  os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
6115       << rd << ", " << rm;
6116}
6117
6118void Disassembler::vrev32(Condition cond,
6119                          DataType dt,
6120                          QRegister rd,
6121                          QRegister rm) {
6122  os().SetCurrentInstruction(kVrev32, kFpNeon);
6123  os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
6124       << rd << ", " << rm;
6125}
6126
6127void Disassembler::vrev64(Condition cond,
6128                          DataType dt,
6129                          DRegister rd,
6130                          DRegister rm) {
6131  os().SetCurrentInstruction(kVrev64, kFpNeon);
6132  os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
6133       << rd << ", " << rm;
6134}
6135
6136void Disassembler::vrev64(Condition cond,
6137                          DataType dt,
6138                          QRegister rd,
6139                          QRegister rm) {
6140  os().SetCurrentInstruction(kVrev64, kFpNeon);
6141  os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
6142       << rd << ", " << rm;
6143}
6144
6145void Disassembler::vrhadd(
6146    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6147  os().SetCurrentInstruction(kVrhadd, kFpNeon);
6148  os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
6149  os() << " ";
6150  if (!rd.Is(rn) || !use_short_hand_form_) {
6151    os() << rd << ", ";
6152  }
6153  os() << rn << ", " << rm;
6154}
6155
6156void Disassembler::vrhadd(
6157    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6158  os().SetCurrentInstruction(kVrhadd, kFpNeon);
6159  os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
6160  os() << " ";
6161  if (!rd.Is(rn) || !use_short_hand_form_) {
6162    os() << rd << ", ";
6163  }
6164  os() << rn << ", " << rm;
6165}
6166
6167void Disassembler::vrinta(DataType dt, DRegister rd, DRegister rm) {
6168  os().SetCurrentInstruction(kVrinta, kFpNeon);
6169  os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
6170}
6171
6172void Disassembler::vrinta(DataType dt, QRegister rd, QRegister rm) {
6173  os().SetCurrentInstruction(kVrinta, kFpNeon);
6174  os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
6175}
6176
6177void Disassembler::vrinta(DataType dt, SRegister rd, SRegister rm) {
6178  os().SetCurrentInstruction(kVrinta, kFpNeon);
6179  os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
6180}
6181
6182void Disassembler::vrintm(DataType dt, DRegister rd, DRegister rm) {
6183  os().SetCurrentInstruction(kVrintm, kFpNeon);
6184  os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
6185}
6186
6187void Disassembler::vrintm(DataType dt, QRegister rd, QRegister rm) {
6188  os().SetCurrentInstruction(kVrintm, kFpNeon);
6189  os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
6190}
6191
6192void Disassembler::vrintm(DataType dt, SRegister rd, SRegister rm) {
6193  os().SetCurrentInstruction(kVrintm, kFpNeon);
6194  os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
6195}
6196
6197void Disassembler::vrintn(DataType dt, DRegister rd, DRegister rm) {
6198  os().SetCurrentInstruction(kVrintn, kFpNeon);
6199  os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
6200}
6201
6202void Disassembler::vrintn(DataType dt, QRegister rd, QRegister rm) {
6203  os().SetCurrentInstruction(kVrintn, kFpNeon);
6204  os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
6205}
6206
6207void Disassembler::vrintn(DataType dt, SRegister rd, SRegister rm) {
6208  os().SetCurrentInstruction(kVrintn, kFpNeon);
6209  os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
6210}
6211
6212void Disassembler::vrintp(DataType dt, DRegister rd, DRegister rm) {
6213  os().SetCurrentInstruction(kVrintp, kFpNeon);
6214  os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
6215}
6216
6217void Disassembler::vrintp(DataType dt, QRegister rd, QRegister rm) {
6218  os().SetCurrentInstruction(kVrintp, kFpNeon);
6219  os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
6220}
6221
6222void Disassembler::vrintp(DataType dt, SRegister rd, SRegister rm) {
6223  os().SetCurrentInstruction(kVrintp, kFpNeon);
6224  os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
6225}
6226
6227void Disassembler::vrintr(Condition cond,
6228                          DataType dt,
6229                          SRegister rd,
6230                          SRegister rm) {
6231  os().SetCurrentInstruction(kVrintr, kFpNeon);
6232  os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " "
6233       << rd << ", " << rm;
6234}
6235
6236void Disassembler::vrintr(Condition cond,
6237                          DataType dt,
6238                          DRegister rd,
6239                          DRegister rm) {
6240  os().SetCurrentInstruction(kVrintr, kFpNeon);
6241  os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " "
6242       << rd << ", " << rm;
6243}
6244
6245void Disassembler::vrintx(Condition cond,
6246                          DataType dt,
6247                          DRegister rd,
6248                          DRegister rm) {
6249  os().SetCurrentInstruction(kVrintx, kFpNeon);
6250  os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " "
6251       << rd << ", " << rm;
6252}
6253
6254void Disassembler::vrintx(DataType dt, QRegister rd, QRegister rm) {
6255  os().SetCurrentInstruction(kVrintx, kFpNeon);
6256  os() << ToCString(kVrintx) << dt << " " << rd << ", " << rm;
6257}
6258
6259void Disassembler::vrintx(Condition cond,
6260                          DataType dt,
6261                          SRegister rd,
6262                          SRegister rm) {
6263  os().SetCurrentInstruction(kVrintx, kFpNeon);
6264  os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " "
6265       << rd << ", " << rm;
6266}
6267
6268void Disassembler::vrintz(Condition cond,
6269                          DataType dt,
6270                          DRegister rd,
6271                          DRegister rm) {
6272  os().SetCurrentInstruction(kVrintz, kFpNeon);
6273  os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " "
6274       << rd << ", " << rm;
6275}
6276
6277void Disassembler::vrintz(DataType dt, QRegister rd, QRegister rm) {
6278  os().SetCurrentInstruction(kVrintz, kFpNeon);
6279  os() << ToCString(kVrintz) << dt << " " << rd << ", " << rm;
6280}
6281
6282void Disassembler::vrintz(Condition cond,
6283                          DataType dt,
6284                          SRegister rd,
6285                          SRegister rm) {
6286  os().SetCurrentInstruction(kVrintz, kFpNeon);
6287  os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " "
6288       << rd << ", " << rm;
6289}
6290
6291void Disassembler::vrshl(
6292    Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
6293  os().SetCurrentInstruction(kVrshl, kFpNeon);
6294  os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
6295  os() << " ";
6296  if (!rd.Is(rm) || !use_short_hand_form_) {
6297    os() << rd << ", ";
6298  }
6299  os() << rm << ", " << rn;
6300}
6301
6302void Disassembler::vrshl(
6303    Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
6304  os().SetCurrentInstruction(kVrshl, kFpNeon);
6305  os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
6306  os() << " ";
6307  if (!rd.Is(rm) || !use_short_hand_form_) {
6308    os() << rd << ", ";
6309  }
6310  os() << rm << ", " << rn;
6311}
6312
6313void Disassembler::vrshr(Condition cond,
6314                         DataType dt,
6315                         DRegister rd,
6316                         DRegister rm,
6317                         const DOperand& operand) {
6318  os().SetCurrentInstruction(kVrshr, kFpNeon);
6319  os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
6320  os() << " ";
6321  if (!rd.Is(rm) || !use_short_hand_form_) {
6322    os() << rd << ", ";
6323  }
6324  os() << rm << ", " << operand;
6325}
6326
6327void Disassembler::vrshr(Condition cond,
6328                         DataType dt,
6329                         QRegister rd,
6330                         QRegister rm,
6331                         const QOperand& operand) {
6332  os().SetCurrentInstruction(kVrshr, kFpNeon);
6333  os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
6334  os() << " ";
6335  if (!rd.Is(rm) || !use_short_hand_form_) {
6336    os() << rd << ", ";
6337  }
6338  os() << rm << ", " << operand;
6339}
6340
6341void Disassembler::vrshrn(Condition cond,
6342                          DataType dt,
6343                          DRegister rd,
6344                          QRegister rm,
6345                          const QOperand& operand) {
6346  os().SetCurrentInstruction(kVrshrn, kFpNeon);
6347  os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6348       << rd << ", " << rm << ", " << operand;
6349}
6350
6351void Disassembler::vrsqrte(Condition cond,
6352                           DataType dt,
6353                           DRegister rd,
6354                           DRegister rm) {
6355  os().SetCurrentInstruction(kVrsqrte, kFpNeon);
6356  os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
6357       << rd << ", " << rm;
6358}
6359
6360void Disassembler::vrsqrte(Condition cond,
6361                           DataType dt,
6362                           QRegister rd,
6363                           QRegister rm) {
6364  os().SetCurrentInstruction(kVrsqrte, kFpNeon);
6365  os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
6366       << rd << ", " << rm;
6367}
6368
6369void Disassembler::vrsqrts(
6370    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6371  os().SetCurrentInstruction(kVrsqrts, kFpNeon);
6372  os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
6373  os() << " ";
6374  if (!rd.Is(rn) || !use_short_hand_form_) {
6375    os() << rd << ", ";
6376  }
6377  os() << rn << ", " << rm;
6378}
6379
6380void Disassembler::vrsqrts(
6381    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6382  os().SetCurrentInstruction(kVrsqrts, kFpNeon);
6383  os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
6384  os() << " ";
6385  if (!rd.Is(rn) || !use_short_hand_form_) {
6386    os() << rd << ", ";
6387  }
6388  os() << rn << ", " << rm;
6389}
6390
6391void Disassembler::vrsra(Condition cond,
6392                         DataType dt,
6393                         DRegister rd,
6394                         DRegister rm,
6395                         const DOperand& operand) {
6396  os().SetCurrentInstruction(kVrsra, kFpNeon);
6397  os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
6398  os() << " ";
6399  if (!rd.Is(rm) || !use_short_hand_form_) {
6400    os() << rd << ", ";
6401  }
6402  os() << rm << ", " << operand;
6403}
6404
6405void Disassembler::vrsra(Condition cond,
6406                         DataType dt,
6407                         QRegister rd,
6408                         QRegister rm,
6409                         const QOperand& operand) {
6410  os().SetCurrentInstruction(kVrsra, kFpNeon);
6411  os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
6412  os() << " ";
6413  if (!rd.Is(rm) || !use_short_hand_form_) {
6414    os() << rd << ", ";
6415  }
6416  os() << rm << ", " << operand;
6417}
6418
6419void Disassembler::vrsubhn(
6420    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6421  os().SetCurrentInstruction(kVrsubhn, kFpNeon);
6422  os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
6423       << rd << ", " << rn << ", " << rm;
6424}
6425
6426void Disassembler::vseleq(DataType dt,
6427                          DRegister rd,
6428                          DRegister rn,
6429                          DRegister rm) {
6430  os().SetCurrentInstruction(kVseleq, kFpNeon);
6431  os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
6432}
6433
6434void Disassembler::vseleq(DataType dt,
6435                          SRegister rd,
6436                          SRegister rn,
6437                          SRegister rm) {
6438  os().SetCurrentInstruction(kVseleq, kFpNeon);
6439  os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
6440}
6441
6442void Disassembler::vselge(DataType dt,
6443                          DRegister rd,
6444                          DRegister rn,
6445                          DRegister rm) {
6446  os().SetCurrentInstruction(kVselge, kFpNeon);
6447  os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
6448}
6449
6450void Disassembler::vselge(DataType dt,
6451                          SRegister rd,
6452                          SRegister rn,
6453                          SRegister rm) {
6454  os().SetCurrentInstruction(kVselge, kFpNeon);
6455  os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
6456}
6457
6458void Disassembler::vselgt(DataType dt,
6459                          DRegister rd,
6460                          DRegister rn,
6461                          DRegister rm) {
6462  os().SetCurrentInstruction(kVselgt, kFpNeon);
6463  os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
6464}
6465
6466void Disassembler::vselgt(DataType dt,
6467                          SRegister rd,
6468                          SRegister rn,
6469                          SRegister rm) {
6470  os().SetCurrentInstruction(kVselgt, kFpNeon);
6471  os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
6472}
6473
6474void Disassembler::vselvs(DataType dt,
6475                          DRegister rd,
6476                          DRegister rn,
6477                          DRegister rm) {
6478  os().SetCurrentInstruction(kVselvs, kFpNeon);
6479  os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
6480}
6481
6482void Disassembler::vselvs(DataType dt,
6483                          SRegister rd,
6484                          SRegister rn,
6485                          SRegister rm) {
6486  os().SetCurrentInstruction(kVselvs, kFpNeon);
6487  os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
6488}
6489
6490void Disassembler::vshl(Condition cond,
6491                        DataType dt,
6492                        DRegister rd,
6493                        DRegister rm,
6494                        const DOperand& operand) {
6495  os().SetCurrentInstruction(kVshl, kFpNeon);
6496  os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
6497  os() << " ";
6498  if (!rd.Is(rm) || !use_short_hand_form_) {
6499    os() << rd << ", ";
6500  }
6501  os() << rm << ", " << operand;
6502}
6503
6504void Disassembler::vshl(Condition cond,
6505                        DataType dt,
6506                        QRegister rd,
6507                        QRegister rm,
6508                        const QOperand& operand) {
6509  os().SetCurrentInstruction(kVshl, kFpNeon);
6510  os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
6511  os() << " ";
6512  if (!rd.Is(rm) || !use_short_hand_form_) {
6513    os() << rd << ", ";
6514  }
6515  os() << rm << ", " << operand;
6516}
6517
6518void Disassembler::vshll(Condition cond,
6519                         DataType dt,
6520                         QRegister rd,
6521                         DRegister rm,
6522                         const DOperand& operand) {
6523  os().SetCurrentInstruction(kVshll, kFpNeon);
6524  os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " "
6525       << rd << ", " << rm << ", " << operand;
6526}
6527
6528void Disassembler::vshr(Condition cond,
6529                        DataType dt,
6530                        DRegister rd,
6531                        DRegister rm,
6532                        const DOperand& operand) {
6533  os().SetCurrentInstruction(kVshr, kFpNeon);
6534  os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
6535  os() << " ";
6536  if (!rd.Is(rm) || !use_short_hand_form_) {
6537    os() << rd << ", ";
6538  }
6539  os() << rm << ", " << operand;
6540}
6541
6542void Disassembler::vshr(Condition cond,
6543                        DataType dt,
6544                        QRegister rd,
6545                        QRegister rm,
6546                        const QOperand& operand) {
6547  os().SetCurrentInstruction(kVshr, kFpNeon);
6548  os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
6549  os() << " ";
6550  if (!rd.Is(rm) || !use_short_hand_form_) {
6551    os() << rd << ", ";
6552  }
6553  os() << rm << ", " << operand;
6554}
6555
6556void Disassembler::vshrn(Condition cond,
6557                         DataType dt,
6558                         DRegister rd,
6559                         QRegister rm,
6560                         const QOperand& operand) {
6561  os().SetCurrentInstruction(kVshrn, kFpNeon);
6562  os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6563       << rd << ", " << rm << ", " << operand;
6564}
6565
6566void Disassembler::vsli(Condition cond,
6567                        DataType dt,
6568                        DRegister rd,
6569                        DRegister rm,
6570                        const DOperand& operand) {
6571  os().SetCurrentInstruction(kVsli, kFpNeon);
6572  os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
6573  os() << " ";
6574  if (!rd.Is(rm) || !use_short_hand_form_) {
6575    os() << rd << ", ";
6576  }
6577  os() << rm << ", " << operand;
6578}
6579
6580void Disassembler::vsli(Condition cond,
6581                        DataType dt,
6582                        QRegister rd,
6583                        QRegister rm,
6584                        const QOperand& operand) {
6585  os().SetCurrentInstruction(kVsli, kFpNeon);
6586  os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
6587  os() << " ";
6588  if (!rd.Is(rm) || !use_short_hand_form_) {
6589    os() << rd << ", ";
6590  }
6591  os() << rm << ", " << operand;
6592}
6593
6594void Disassembler::vsqrt(Condition cond,
6595                         DataType dt,
6596                         SRegister rd,
6597                         SRegister rm) {
6598  os().SetCurrentInstruction(kVsqrt, kFpNeon);
6599  os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
6600       << rd << ", " << rm;
6601}
6602
6603void Disassembler::vsqrt(Condition cond,
6604                         DataType dt,
6605                         DRegister rd,
6606                         DRegister rm) {
6607  os().SetCurrentInstruction(kVsqrt, kFpNeon);
6608  os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
6609       << rd << ", " << rm;
6610}
6611
6612void Disassembler::vsra(Condition cond,
6613                        DataType dt,
6614                        DRegister rd,
6615                        DRegister rm,
6616                        const DOperand& operand) {
6617  os().SetCurrentInstruction(kVsra, kFpNeon);
6618  os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
6619  os() << " ";
6620  if (!rd.Is(rm) || !use_short_hand_form_) {
6621    os() << rd << ", ";
6622  }
6623  os() << rm << ", " << operand;
6624}
6625
6626void Disassembler::vsra(Condition cond,
6627                        DataType dt,
6628                        QRegister rd,
6629                        QRegister rm,
6630                        const QOperand& operand) {
6631  os().SetCurrentInstruction(kVsra, kFpNeon);
6632  os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
6633  os() << " ";
6634  if (!rd.Is(rm) || !use_short_hand_form_) {
6635    os() << rd << ", ";
6636  }
6637  os() << rm << ", " << operand;
6638}
6639
6640void Disassembler::vsri(Condition cond,
6641                        DataType dt,
6642                        DRegister rd,
6643                        DRegister rm,
6644                        const DOperand& operand) {
6645  os().SetCurrentInstruction(kVsri, kFpNeon);
6646  os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
6647  os() << " ";
6648  if (!rd.Is(rm) || !use_short_hand_form_) {
6649    os() << rd << ", ";
6650  }
6651  os() << rm << ", " << operand;
6652}
6653
6654void Disassembler::vsri(Condition cond,
6655                        DataType dt,
6656                        QRegister rd,
6657                        QRegister rm,
6658                        const QOperand& operand) {
6659  os().SetCurrentInstruction(kVsri, kFpNeon);
6660  os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
6661  os() << " ";
6662  if (!rd.Is(rm) || !use_short_hand_form_) {
6663    os() << rd << ", ";
6664  }
6665  os() << rm << ", " << operand;
6666}
6667
6668void Disassembler::vst1(Condition cond,
6669                        DataType dt,
6670                        const NeonRegisterList& nreglist,
6671                        const AlignedMemOperand& operand) {
6672  os().SetCurrentInstruction(kVst1, kFpNeon);
6673  os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " "
6674       << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand);
6675}
6676
6677void Disassembler::vst2(Condition cond,
6678                        DataType dt,
6679                        const NeonRegisterList& nreglist,
6680                        const AlignedMemOperand& operand) {
6681  os().SetCurrentInstruction(kVst2, kFpNeon);
6682  os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " "
6683       << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand);
6684}
6685
6686void Disassembler::vst3(Condition cond,
6687                        DataType dt,
6688                        const NeonRegisterList& nreglist,
6689                        const AlignedMemOperand& operand) {
6690  os().SetCurrentInstruction(kVst3, kFpNeon);
6691  os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
6692       << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand);
6693}
6694
6695void Disassembler::vst3(Condition cond,
6696                        DataType dt,
6697                        const NeonRegisterList& nreglist,
6698                        const MemOperand& operand) {
6699  os().SetCurrentInstruction(kVst3, kFpNeon);
6700  os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
6701       << nreglist << ", " << PrintMemOperand(kVst3Location, operand);
6702}
6703
6704void Disassembler::vst4(Condition cond,
6705                        DataType dt,
6706                        const NeonRegisterList& nreglist,
6707                        const AlignedMemOperand& operand) {
6708  os().SetCurrentInstruction(kVst4, kFpNeon);
6709  os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " "
6710       << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand);
6711}
6712
6713void Disassembler::vstm(Condition cond,
6714                        DataType dt,
6715                        Register rn,
6716                        WriteBack write_back,
6717                        DRegisterList dreglist) {
6718  os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
6719  os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
6720       << rn << write_back << ", " << dreglist;
6721}
6722
6723void Disassembler::vstm(Condition cond,
6724                        DataType dt,
6725                        Register rn,
6726                        WriteBack write_back,
6727                        SRegisterList sreglist) {
6728  os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
6729  os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
6730       << rn << write_back << ", " << sreglist;
6731}
6732
6733void Disassembler::vstmdb(Condition cond,
6734                          DataType dt,
6735                          Register rn,
6736                          WriteBack write_back,
6737                          DRegisterList dreglist) {
6738  os().SetCurrentInstruction(kVstmdb,
6739                             kLoadStore | kLoadStoreMultiple | kFpNeon);
6740  os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
6741       << rn << write_back << ", " << dreglist;
6742}
6743
6744void Disassembler::vstmdb(Condition cond,
6745                          DataType dt,
6746                          Register rn,
6747                          WriteBack write_back,
6748                          SRegisterList sreglist) {
6749  os().SetCurrentInstruction(kVstmdb,
6750                             kLoadStore | kLoadStoreMultiple | kFpNeon);
6751  os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
6752       << rn << write_back << ", " << sreglist;
6753}
6754
6755void Disassembler::vstmia(Condition cond,
6756                          DataType dt,
6757                          Register rn,
6758                          WriteBack write_back,
6759                          DRegisterList dreglist) {
6760  os().SetCurrentInstruction(kVstmia,
6761                             kLoadStore | kLoadStoreMultiple | kFpNeon);
6762  os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
6763       << rn << write_back << ", " << dreglist;
6764}
6765
6766void Disassembler::vstmia(Condition cond,
6767                          DataType dt,
6768                          Register rn,
6769                          WriteBack write_back,
6770                          SRegisterList sreglist) {
6771  os().SetCurrentInstruction(kVstmia,
6772                             kLoadStore | kLoadStoreMultiple | kFpNeon);
6773  os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
6774       << rn << write_back << ", " << sreglist;
6775}
6776
6777void Disassembler::vstr(Condition cond,
6778                        DataType dt,
6779                        DRegister rd,
6780                        const MemOperand& operand) {
6781  os().SetCurrentInstruction(kVstr, kFpNeon);
6782  os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
6783       << DtPrinter(dt, Untyped64) << " " << rd << ", "
6784       << PrintMemOperand(kStoreDoublePrecisionLocation, operand);
6785}
6786
6787void Disassembler::vstr(Condition cond,
6788                        DataType dt,
6789                        SRegister rd,
6790                        const MemOperand& operand) {
6791  os().SetCurrentInstruction(kVstr, kFpNeon);
6792  os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
6793       << DtPrinter(dt, Untyped32) << " " << rd << ", "
6794       << PrintMemOperand(kStoreSinglePrecisionLocation, operand);
6795}
6796
6797void Disassembler::vsub(
6798    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6799  os().SetCurrentInstruction(kVsub, kFpNeon);
6800  os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6801  os() << " ";
6802  if (!rd.Is(rn) || !use_short_hand_form_) {
6803    os() << rd << ", ";
6804  }
6805  os() << rn << ", " << rm;
6806}
6807
6808void Disassembler::vsub(
6809    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6810  os().SetCurrentInstruction(kVsub, kFpNeon);
6811  os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6812  os() << " ";
6813  if (!rd.Is(rn) || !use_short_hand_form_) {
6814    os() << rd << ", ";
6815  }
6816  os() << rn << ", " << rm;
6817}
6818
6819void Disassembler::vsub(
6820    Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6821  os().SetCurrentInstruction(kVsub, kFpNeon);
6822  os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6823  os() << " ";
6824  if (!rd.Is(rn) || !use_short_hand_form_) {
6825    os() << rd << ", ";
6826  }
6827  os() << rn << ", " << rm;
6828}
6829
6830void Disassembler::vsubhn(
6831    Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6832  os().SetCurrentInstruction(kVsubhn, kFpNeon);
6833  os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
6834       << rd << ", " << rn << ", " << rm;
6835}
6836
6837void Disassembler::vsubl(
6838    Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6839  os().SetCurrentInstruction(kVsubl, kFpNeon);
6840  os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " "
6841       << rd << ", " << rn << ", " << rm;
6842}
6843
6844void Disassembler::vsubw(
6845    Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
6846  os().SetCurrentInstruction(kVsubw, kFpNeon);
6847  os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt;
6848  os() << " ";
6849  if (!rd.Is(rn) || !use_short_hand_form_) {
6850    os() << rd << ", ";
6851  }
6852  os() << rn << ", " << rm;
6853}
6854
6855void Disassembler::vswp(Condition cond,
6856                        DataType dt,
6857                        DRegister rd,
6858                        DRegister rm) {
6859  os().SetCurrentInstruction(kVswp, kFpNeon);
6860  os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
6861       << rd << ", " << rm;
6862}
6863
6864void Disassembler::vswp(Condition cond,
6865                        DataType dt,
6866                        QRegister rd,
6867                        QRegister rm) {
6868  os().SetCurrentInstruction(kVswp, kFpNeon);
6869  os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
6870       << rd << ", " << rm;
6871}
6872
6873void Disassembler::vtbl(Condition cond,
6874                        DataType dt,
6875                        DRegister rd,
6876                        const NeonRegisterList& nreglist,
6877                        DRegister rm) {
6878  os().SetCurrentInstruction(kVtbl, kFpNeon);
6879  os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " "
6880       << rd << ", " << nreglist << ", " << rm;
6881}
6882
6883void Disassembler::vtbx(Condition cond,
6884                        DataType dt,
6885                        DRegister rd,
6886                        const NeonRegisterList& nreglist,
6887                        DRegister rm) {
6888  os().SetCurrentInstruction(kVtbx, kFpNeon);
6889  os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " "
6890       << rd << ", " << nreglist << ", " << rm;
6891}
6892
6893void Disassembler::vtrn(Condition cond,
6894                        DataType dt,
6895                        DRegister rd,
6896                        DRegister rm) {
6897  os().SetCurrentInstruction(kVtrn, kFpNeon);
6898  os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
6899       << rd << ", " << rm;
6900}
6901
6902void Disassembler::vtrn(Condition cond,
6903                        DataType dt,
6904                        QRegister rd,
6905                        QRegister rm) {
6906  os().SetCurrentInstruction(kVtrn, kFpNeon);
6907  os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
6908       << rd << ", " << rm;
6909}
6910
6911void Disassembler::vtst(
6912    Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6913  os().SetCurrentInstruction(kVtst, kFpNeon);
6914  os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
6915  os() << " ";
6916  if (!rd.Is(rn) || !use_short_hand_form_) {
6917    os() << rd << ", ";
6918  }
6919  os() << rn << ", " << rm;
6920}
6921
6922void Disassembler::vtst(
6923    Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6924  os().SetCurrentInstruction(kVtst, kFpNeon);
6925  os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
6926  os() << " ";
6927  if (!rd.Is(rn) || !use_short_hand_form_) {
6928    os() << rd << ", ";
6929  }
6930  os() << rn << ", " << rm;
6931}
6932
6933void Disassembler::vuzp(Condition cond,
6934                        DataType dt,
6935                        DRegister rd,
6936                        DRegister rm) {
6937  os().SetCurrentInstruction(kVuzp, kFpNeon);
6938  os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
6939       << rd << ", " << rm;
6940}
6941
6942void Disassembler::vuzp(Condition cond,
6943                        DataType dt,
6944                        QRegister rd,
6945                        QRegister rm) {
6946  os().SetCurrentInstruction(kVuzp, kFpNeon);
6947  os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
6948       << rd << ", " << rm;
6949}
6950
6951void Disassembler::vzip(Condition cond,
6952                        DataType dt,
6953                        DRegister rd,
6954                        DRegister rm) {
6955  os().SetCurrentInstruction(kVzip, kFpNeon);
6956  os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
6957       << rd << ", " << rm;
6958}
6959
6960void Disassembler::vzip(Condition cond,
6961                        DataType dt,
6962                        QRegister rd,
6963                        QRegister rm) {
6964  os().SetCurrentInstruction(kVzip, kFpNeon);
6965  os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
6966       << rd << ", " << rm;
6967}
6968
6969void Disassembler::yield(Condition cond, EncodingSize size) {
6970  os().SetCurrentInstruction(kYield, kNoAttribute);
6971  os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size;
6972}
6973
6974int Disassembler::T32Size(uint32_t instr) {
6975  if ((instr & 0xe0000000) == 0xe0000000) {
6976    switch (instr & 0x08000000) {
6977      case 0x00000000:
6978        if ((instr & 0x10000000) == 0x10000000) return 4;
6979        return 2;
6980      case 0x08000000:
6981        return 4;
6982      default:
6983        return 2;
6984    }
6985  }
6986  return 2;
6987}
6988
6989void Disassembler::DecodeT32(uint32_t instr) {
6990  T32CodeAddressIncrementer incrementer(instr, &code_address_);
6991  ITBlockScope it_scope(&it_block_);
6992
6993  switch (instr & 0xe0000000) {
6994    case 0x00000000: {
6995      // 0x00000000
6996      switch (instr & 0x18000000) {
6997        case 0x18000000: {
6998          // 0x18000000
6999          switch (instr & 0x06000000) {
7000            case 0x00000000: {
7001              // 0x18000000
7002              unsigned rd = (instr >> 16) & 0x7;
7003              unsigned rn = (instr >> 19) & 0x7;
7004              unsigned rm = (instr >> 22) & 0x7;
7005              if (InITBlock()) {
7006                // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
7007                add(CurrentCond(),
7008                    Narrow,
7009                    Register(rd),
7010                    Register(rn),
7011                    Register(rm));
7012              } else {
7013                VIXL_ASSERT(OutsideITBlock());
7014                // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
7015                adds(Condition::None(),
7016                     Narrow,
7017                     Register(rd),
7018                     Register(rn),
7019                     Register(rm));
7020              }
7021              break;
7022            }
7023            case 0x02000000: {
7024              // 0x1a000000
7025              unsigned rd = (instr >> 16) & 0x7;
7026              unsigned rn = (instr >> 19) & 0x7;
7027              unsigned rm = (instr >> 22) & 0x7;
7028              if (InITBlock()) {
7029                // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
7030                sub(CurrentCond(),
7031                    Narrow,
7032                    Register(rd),
7033                    Register(rn),
7034                    Register(rm));
7035              } else {
7036                VIXL_ASSERT(OutsideITBlock());
7037                // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
7038                subs(Condition::None(),
7039                     Narrow,
7040                     Register(rd),
7041                     Register(rn),
7042                     Register(rm));
7043              }
7044              break;
7045            }
7046            case 0x04000000: {
7047              // 0x1c000000
7048              unsigned rd = (instr >> 16) & 0x7;
7049              unsigned rn = (instr >> 19) & 0x7;
7050              uint32_t imm = (instr >> 22) & 0x7;
7051              if (InITBlock()) {
7052                // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
7053                add(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
7054              } else {
7055                VIXL_ASSERT(OutsideITBlock());
7056                // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1
7057                adds(Condition::None(),
7058                     Narrow,
7059                     Register(rd),
7060                     Register(rn),
7061                     imm);
7062              }
7063              break;
7064            }
7065            case 0x06000000: {
7066              // 0x1e000000
7067              unsigned rd = (instr >> 16) & 0x7;
7068              unsigned rn = (instr >> 19) & 0x7;
7069              uint32_t imm = (instr >> 22) & 0x7;
7070              if (InITBlock()) {
7071                // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
7072                sub(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
7073              } else {
7074                VIXL_ASSERT(OutsideITBlock());
7075                // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1
7076                subs(Condition::None(),
7077                     Narrow,
7078                     Register(rd),
7079                     Register(rn),
7080                     imm);
7081              }
7082              break;
7083            }
7084          }
7085          break;
7086        }
7087        default: {
7088          if (((instr & 0x18000000) == 0x18000000)) {
7089            UnallocatedT32(instr);
7090            return;
7091          }
7092          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
7093              InITBlock()) {
7094            unsigned rd = (instr >> 16) & 0x7;
7095            unsigned rm = (instr >> 19) & 0x7;
7096            uint32_t amount = (instr >> 22) & 0x1f;
7097            if (amount == 0) amount = 32;
7098            // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7099            asr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
7100            return;
7101          }
7102          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
7103              !InITBlock()) {
7104            unsigned rd = (instr >> 16) & 0x7;
7105            unsigned rm = (instr >> 19) & 0x7;
7106            uint32_t amount = (instr >> 22) & 0x1f;
7107            if (amount == 0) amount = 32;
7108            // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7109            asrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
7110            return;
7111          }
7112          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
7113              ((instr & 0x07c00000) != 0x00000000) && InITBlock()) {
7114            unsigned rd = (instr >> 16) & 0x7;
7115            unsigned rm = (instr >> 19) & 0x7;
7116            uint32_t amount = (instr >> 22) & 0x1f;
7117            // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7118            lsl(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
7119            return;
7120          }
7121          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
7122              ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) {
7123            unsigned rd = (instr >> 16) & 0x7;
7124            unsigned rm = (instr >> 19) & 0x7;
7125            uint32_t amount = (instr >> 22) & 0x1f;
7126            // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7127            lsls(Condition::None(), Narrow, Register(rd), Register(rm), amount);
7128            return;
7129          }
7130          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
7131              InITBlock()) {
7132            unsigned rd = (instr >> 16) & 0x7;
7133            unsigned rm = (instr >> 19) & 0x7;
7134            uint32_t amount = (instr >> 22) & 0x1f;
7135            if (amount == 0) amount = 32;
7136            // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7137            lsr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
7138            return;
7139          }
7140          if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
7141              !InITBlock()) {
7142            unsigned rd = (instr >> 16) & 0x7;
7143            unsigned rm = (instr >> 19) & 0x7;
7144            uint32_t amount = (instr >> 22) & 0x1f;
7145            if (amount == 0) amount = 32;
7146            // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7147            lsrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
7148            return;
7149          }
7150          unsigned rd = (instr >> 16) & 0x7;
7151          unsigned rm = (instr >> 19) & 0x7;
7152          ImmediateShiftOperand shift_operand((instr >> 27) & 0x3,
7153                                              (instr >> 22) & 0x1f);
7154          if (InITBlock()) {
7155            // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
7156            mov(CurrentCond(),
7157                Narrow,
7158                Register(rd),
7159                Operand(Register(rm),
7160                        shift_operand.GetType(),
7161                        shift_operand.GetAmount()));
7162          } else {
7163            VIXL_ASSERT(OutsideITBlock());
7164            // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
7165            movs(Condition::None(),
7166                 Narrow,
7167                 Register(rd),
7168                 Operand(Register(rm),
7169                         shift_operand.GetType(),
7170                         shift_operand.GetAmount()));
7171          }
7172          break;
7173        }
7174      }
7175      break;
7176    }
7177    case 0x20000000: {
7178      // 0x20000000
7179      switch (instr & 0x18000000) {
7180        case 0x00000000: {
7181          // 0x20000000
7182          unsigned rd = (instr >> 24) & 0x7;
7183          uint32_t imm = (instr >> 16) & 0xff;
7184          if (InITBlock()) {
7185            // MOV<c>{<q>} <Rd>, #<imm8> ; T1
7186            mov(CurrentCond(), Narrow, Register(rd), imm);
7187          } else {
7188            VIXL_ASSERT(OutsideITBlock());
7189            // MOVS{<q>} <Rd>, #<imm8> ; T1
7190            movs(Condition::None(), Narrow, Register(rd), imm);
7191          }
7192          break;
7193        }
7194        case 0x08000000: {
7195          // 0x28000000
7196          unsigned rn = (instr >> 24) & 0x7;
7197          uint32_t imm = (instr >> 16) & 0xff;
7198          // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
7199          cmp(CurrentCond(), Narrow, Register(rn), imm);
7200          break;
7201        }
7202        case 0x10000000: {
7203          // 0x30000000
7204          unsigned rd = (instr >> 24) & 0x7;
7205          uint32_t imm = (instr >> 16) & 0xff;
7206          if (InITBlock() && ((imm <= 7))) {
7207            // ADD<c>{<q>} <Rdn>, #<imm8> ; T2
7208            add(CurrentCond(), Register(rd), imm);
7209          } else if (InITBlock() && ((imm > 7))) {
7210            // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7211            add(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
7212          } else if (OutsideITBlock() && ((imm <= 7))) {
7213            // ADDS{<q>} <Rdn>, #<imm8> ; T2
7214            adds(Register(rd), imm);
7215          } else if (OutsideITBlock() && ((imm > 7))) {
7216            // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7217            adds(Condition::None(), Narrow, Register(rd), Register(rd), imm);
7218          } else {
7219            UnallocatedT32(instr);
7220          }
7221          break;
7222        }
7223        case 0x18000000: {
7224          // 0x38000000
7225          unsigned rd = (instr >> 24) & 0x7;
7226          uint32_t imm = (instr >> 16) & 0xff;
7227          if (InITBlock() && ((imm <= 7))) {
7228            // SUB<c>{<q>} <Rdn>, #<imm8> ; T2
7229            sub(CurrentCond(), Register(rd), imm);
7230          } else if (InITBlock() && ((imm > 7))) {
7231            // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7232            sub(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
7233          } else if (OutsideITBlock() && ((imm <= 7))) {
7234            // SUBS{<q>} <Rdn>, #<imm8> ; T2
7235            subs(Register(rd), imm);
7236          } else if (OutsideITBlock() && ((imm > 7))) {
7237            // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7238            subs(Condition::None(), Narrow, Register(rd), Register(rd), imm);
7239          } else {
7240            UnallocatedT32(instr);
7241          }
7242          break;
7243        }
7244      }
7245      break;
7246    }
7247    case 0x40000000: {
7248      // 0x40000000
7249      switch (instr & 0x18000000) {
7250        case 0x00000000: {
7251          // 0x40000000
7252          switch (instr & 0x07000000) {
7253            case 0x00000000: {
7254              // 0x40000000
7255              switch (instr & 0x00c00000) {
7256                case 0x00000000: {
7257                  // 0x40000000
7258                  unsigned rd = (instr >> 16) & 0x7;
7259                  unsigned rm = (instr >> 19) & 0x7;
7260                  if (InITBlock()) {
7261                    // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7262                    and_(CurrentCond(),
7263                         Narrow,
7264                         Register(rd),
7265                         Register(rd),
7266                         Register(rm));
7267                  } else {
7268                    VIXL_ASSERT(OutsideITBlock());
7269                    // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7270                    ands(Condition::None(),
7271                         Narrow,
7272                         Register(rd),
7273                         Register(rd),
7274                         Register(rm));
7275                  }
7276                  break;
7277                }
7278                case 0x00400000: {
7279                  // 0x40400000
7280                  unsigned rd = (instr >> 16) & 0x7;
7281                  unsigned rm = (instr >> 19) & 0x7;
7282                  if (InITBlock()) {
7283                    // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7284                    eor(CurrentCond(),
7285                        Narrow,
7286                        Register(rd),
7287                        Register(rd),
7288                        Register(rm));
7289                  } else {
7290                    VIXL_ASSERT(OutsideITBlock());
7291                    // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7292                    eors(Condition::None(),
7293                         Narrow,
7294                         Register(rd),
7295                         Register(rd),
7296                         Register(rm));
7297                  }
7298                  break;
7299                }
7300                case 0x00800000: {
7301                  // 0x40800000
7302                  if (InITBlock()) {
7303                    unsigned rd = (instr >> 16) & 0x7;
7304                    unsigned rs = (instr >> 19) & 0x7;
7305                    // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7306                    lsl(CurrentCond(),
7307                        Narrow,
7308                        Register(rd),
7309                        Register(rd),
7310                        Register(rs));
7311                    return;
7312                  }
7313                  if (!InITBlock()) {
7314                    unsigned rd = (instr >> 16) & 0x7;
7315                    unsigned rs = (instr >> 19) & 0x7;
7316                    // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7317                    lsls(Condition::None(),
7318                         Narrow,
7319                         Register(rd),
7320                         Register(rd),
7321                         Register(rs));
7322                    return;
7323                  }
7324                  unsigned rd = (instr >> 16) & 0x7;
7325                  unsigned rm = (instr >> 16) & 0x7;
7326                  unsigned rs = (instr >> 19) & 0x7;
7327                  if (InITBlock()) {
7328                    // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
7329                    mov(CurrentCond(),
7330                        Narrow,
7331                        Register(rd),
7332                        Operand(Register(rm), LSL, Register(rs)));
7333                  } else {
7334                    VIXL_ASSERT(OutsideITBlock());
7335                    // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
7336                    movs(Condition::None(),
7337                         Narrow,
7338                         Register(rd),
7339                         Operand(Register(rm), LSL, Register(rs)));
7340                  }
7341                  break;
7342                }
7343                case 0x00c00000: {
7344                  // 0x40c00000
7345                  if (InITBlock()) {
7346                    unsigned rd = (instr >> 16) & 0x7;
7347                    unsigned rs = (instr >> 19) & 0x7;
7348                    // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7349                    lsr(CurrentCond(),
7350                        Narrow,
7351                        Register(rd),
7352                        Register(rd),
7353                        Register(rs));
7354                    return;
7355                  }
7356                  if (!InITBlock()) {
7357                    unsigned rd = (instr >> 16) & 0x7;
7358                    unsigned rs = (instr >> 19) & 0x7;
7359                    // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7360                    lsrs(Condition::None(),
7361                         Narrow,
7362                         Register(rd),
7363                         Register(rd),
7364                         Register(rs));
7365                    return;
7366                  }
7367                  unsigned rd = (instr >> 16) & 0x7;
7368                  unsigned rm = (instr >> 16) & 0x7;
7369                  unsigned rs = (instr >> 19) & 0x7;
7370                  if (InITBlock()) {
7371                    // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
7372                    mov(CurrentCond(),
7373                        Narrow,
7374                        Register(rd),
7375                        Operand(Register(rm), LSR, Register(rs)));
7376                  } else {
7377                    VIXL_ASSERT(OutsideITBlock());
7378                    // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
7379                    movs(Condition::None(),
7380                         Narrow,
7381                         Register(rd),
7382                         Operand(Register(rm), LSR, Register(rs)));
7383                  }
7384                  break;
7385                }
7386              }
7387              break;
7388            }
7389            case 0x01000000: {
7390              // 0x41000000
7391              switch (instr & 0x00c00000) {
7392                case 0x00000000: {
7393                  // 0x41000000
7394                  if (InITBlock()) {
7395                    unsigned rd = (instr >> 16) & 0x7;
7396                    unsigned rs = (instr >> 19) & 0x7;
7397                    // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7398                    asr(CurrentCond(),
7399                        Narrow,
7400                        Register(rd),
7401                        Register(rd),
7402                        Register(rs));
7403                    return;
7404                  }
7405                  if (!InITBlock()) {
7406                    unsigned rd = (instr >> 16) & 0x7;
7407                    unsigned rs = (instr >> 19) & 0x7;
7408                    // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7409                    asrs(Condition::None(),
7410                         Narrow,
7411                         Register(rd),
7412                         Register(rd),
7413                         Register(rs));
7414                    return;
7415                  }
7416                  unsigned rd = (instr >> 16) & 0x7;
7417                  unsigned rm = (instr >> 16) & 0x7;
7418                  unsigned rs = (instr >> 19) & 0x7;
7419                  if (InITBlock()) {
7420                    // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
7421                    mov(CurrentCond(),
7422                        Narrow,
7423                        Register(rd),
7424                        Operand(Register(rm), ASR, Register(rs)));
7425                  } else {
7426                    VIXL_ASSERT(OutsideITBlock());
7427                    // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
7428                    movs(Condition::None(),
7429                         Narrow,
7430                         Register(rd),
7431                         Operand(Register(rm), ASR, Register(rs)));
7432                  }
7433                  break;
7434                }
7435                case 0x00400000: {
7436                  // 0x41400000
7437                  unsigned rd = (instr >> 16) & 0x7;
7438                  unsigned rm = (instr >> 19) & 0x7;
7439                  if (InITBlock()) {
7440                    // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7441                    adc(CurrentCond(),
7442                        Narrow,
7443                        Register(rd),
7444                        Register(rd),
7445                        Register(rm));
7446                  } else {
7447                    VIXL_ASSERT(OutsideITBlock());
7448                    // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7449                    adcs(Condition::None(),
7450                         Narrow,
7451                         Register(rd),
7452                         Register(rd),
7453                         Register(rm));
7454                  }
7455                  break;
7456                }
7457                case 0x00800000: {
7458                  // 0x41800000
7459                  unsigned rd = (instr >> 16) & 0x7;
7460                  unsigned rm = (instr >> 19) & 0x7;
7461                  if (InITBlock()) {
7462                    // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7463                    sbc(CurrentCond(),
7464                        Narrow,
7465                        Register(rd),
7466                        Register(rd),
7467                        Register(rm));
7468                  } else {
7469                    VIXL_ASSERT(OutsideITBlock());
7470                    // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7471                    sbcs(Condition::None(),
7472                         Narrow,
7473                         Register(rd),
7474                         Register(rd),
7475                         Register(rm));
7476                  }
7477                  break;
7478                }
7479                case 0x00c00000: {
7480                  // 0x41c00000
7481                  if (InITBlock()) {
7482                    unsigned rd = (instr >> 16) & 0x7;
7483                    unsigned rs = (instr >> 19) & 0x7;
7484                    // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7485                    ror(CurrentCond(),
7486                        Narrow,
7487                        Register(rd),
7488                        Register(rd),
7489                        Register(rs));
7490                    return;
7491                  }
7492                  if (!InITBlock()) {
7493                    unsigned rd = (instr >> 16) & 0x7;
7494                    unsigned rs = (instr >> 19) & 0x7;
7495                    // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7496                    rors(Condition::None(),
7497                         Narrow,
7498                         Register(rd),
7499                         Register(rd),
7500                         Register(rs));
7501                    return;
7502                  }
7503                  unsigned rd = (instr >> 16) & 0x7;
7504                  unsigned rm = (instr >> 16) & 0x7;
7505                  unsigned rs = (instr >> 19) & 0x7;
7506                  if (InITBlock()) {
7507                    // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
7508                    mov(CurrentCond(),
7509                        Narrow,
7510                        Register(rd),
7511                        Operand(Register(rm), ROR, Register(rs)));
7512                  } else {
7513                    VIXL_ASSERT(OutsideITBlock());
7514                    // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
7515                    movs(Condition::None(),
7516                         Narrow,
7517                         Register(rd),
7518                         Operand(Register(rm), ROR, Register(rs)));
7519                  }
7520                  break;
7521                }
7522              }
7523              break;
7524            }
7525            case 0x02000000: {
7526              // 0x42000000
7527              switch (instr & 0x00c00000) {
7528                case 0x00000000: {
7529                  // 0x42000000
7530                  unsigned rn = (instr >> 16) & 0x7;
7531                  unsigned rm = (instr >> 19) & 0x7;
7532                  // TST{<c>}{<q>} <Rn>, <Rm> ; T1
7533                  tst(CurrentCond(), Narrow, Register(rn), Register(rm));
7534                  break;
7535                }
7536                case 0x00400000: {
7537                  // 0x42400000
7538                  unsigned rd = (instr >> 16) & 0x7;
7539                  unsigned rn = (instr >> 19) & 0x7;
7540                  if (InITBlock()) {
7541                    // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1
7542                    rsb(CurrentCond(),
7543                        Narrow,
7544                        Register(rd),
7545                        Register(rn),
7546                        UINT32_C(0));
7547                  } else {
7548                    VIXL_ASSERT(OutsideITBlock());
7549                    // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1
7550                    rsbs(Condition::None(),
7551                         Narrow,
7552                         Register(rd),
7553                         Register(rn),
7554                         UINT32_C(0));
7555                  }
7556                  break;
7557                }
7558                case 0x00800000: {
7559                  // 0x42800000
7560                  unsigned rn = (instr >> 16) & 0x7;
7561                  unsigned rm = (instr >> 19) & 0x7;
7562                  // CMP{<c>}{<q>} <Rn>, <Rm> ; T1
7563                  cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
7564                  break;
7565                }
7566                case 0x00c00000: {
7567                  // 0x42c00000
7568                  unsigned rn = (instr >> 16) & 0x7;
7569                  unsigned rm = (instr >> 19) & 0x7;
7570                  // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
7571                  cmn(CurrentCond(), Narrow, Register(rn), Register(rm));
7572                  break;
7573                }
7574              }
7575              break;
7576            }
7577            case 0x03000000: {
7578              // 0x43000000
7579              switch (instr & 0x00c00000) {
7580                case 0x00000000: {
7581                  // 0x43000000
7582                  unsigned rd = (instr >> 16) & 0x7;
7583                  unsigned rm = (instr >> 19) & 0x7;
7584                  if (InITBlock()) {
7585                    // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7586                    orr(CurrentCond(),
7587                        Narrow,
7588                        Register(rd),
7589                        Register(rd),
7590                        Register(rm));
7591                  } else {
7592                    VIXL_ASSERT(OutsideITBlock());
7593                    // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7594                    orrs(Condition::None(),
7595                         Narrow,
7596                         Register(rd),
7597                         Register(rd),
7598                         Register(rm));
7599                  }
7600                  break;
7601                }
7602                case 0x00400000: {
7603                  // 0x43400000
7604                  unsigned rd = (instr >> 16) & 0x7;
7605                  unsigned rn = (instr >> 19) & 0x7;
7606                  if (InITBlock()) {
7607                    // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
7608                    mul(CurrentCond(),
7609                        Narrow,
7610                        Register(rd),
7611                        Register(rn),
7612                        Register(rd));
7613                  } else {
7614                    VIXL_ASSERT(OutsideITBlock());
7615                    // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
7616                    muls(Condition::None(),
7617                         Register(rd),
7618                         Register(rn),
7619                         Register(rd));
7620                  }
7621                  break;
7622                }
7623                case 0x00800000: {
7624                  // 0x43800000
7625                  unsigned rd = (instr >> 16) & 0x7;
7626                  unsigned rm = (instr >> 19) & 0x7;
7627                  if (InITBlock()) {
7628                    // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7629                    bic(CurrentCond(),
7630                        Narrow,
7631                        Register(rd),
7632                        Register(rd),
7633                        Register(rm));
7634                  } else {
7635                    VIXL_ASSERT(OutsideITBlock());
7636                    // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7637                    bics(Condition::None(),
7638                         Narrow,
7639                         Register(rd),
7640                         Register(rd),
7641                         Register(rm));
7642                  }
7643                  break;
7644                }
7645                case 0x00c00000: {
7646                  // 0x43c00000
7647                  unsigned rd = (instr >> 16) & 0x7;
7648                  unsigned rm = (instr >> 19) & 0x7;
7649                  if (InITBlock()) {
7650                    // MVN<c>{<q>} <Rd>, <Rm> ; T1
7651                    mvn(CurrentCond(), Narrow, Register(rd), Register(rm));
7652                  } else {
7653                    VIXL_ASSERT(OutsideITBlock());
7654                    // MVNS{<q>} <Rd>, <Rm> ; T1
7655                    mvns(Condition::None(), Narrow, Register(rd), Register(rm));
7656                  }
7657                  break;
7658                }
7659              }
7660              break;
7661            }
7662            case 0x04000000: {
7663              // 0x44000000
7664              switch (instr & 0x00780000) {
7665                case 0x00680000: {
7666                  // 0x44680000
7667                  unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7668                  // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1
7669                  add(CurrentCond(), Narrow, Register(rd), sp, Register(rd));
7670                  break;
7671                }
7672                default: {
7673                  switch (instr & 0x00870000) {
7674                    case 0x00850000: {
7675                      // 0x44850000
7676                      if (((instr & 0x780000) == 0x680000)) {
7677                        UnallocatedT32(instr);
7678                        return;
7679                      }
7680                      unsigned rm = (instr >> 19) & 0xf;
7681                      // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2
7682                      add(CurrentCond(), Narrow, sp, sp, Register(rm));
7683                      break;
7684                    }
7685                    default: {
7686                      if (((instr & 0x780000) == 0x680000) ||
7687                          ((instr & 0x870000) == 0x850000)) {
7688                        UnallocatedT32(instr);
7689                        return;
7690                      }
7691                      unsigned rd =
7692                          ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7693                      unsigned rm = (instr >> 19) & 0xf;
7694                      if (InITBlock()) {
7695                        // ADD<c>{<q>} <Rdn>, <Rm> ; T2
7696                        add(CurrentCond(), Register(rd), Register(rm));
7697                      } else {
7698                        // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2
7699                        add(CurrentCond(),
7700                            Narrow,
7701                            Register(rd),
7702                            Register(rd),
7703                            Register(rm));
7704                      }
7705                      break;
7706                    }
7707                  }
7708                  break;
7709                }
7710              }
7711              break;
7712            }
7713            case 0x05000000: {
7714              // 0x45000000
7715              unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7716              unsigned rm = (instr >> 19) & 0xf;
7717              // CMP{<c>}{<q>} <Rn>, <Rm> ; T2
7718              cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
7719              break;
7720            }
7721            case 0x06000000: {
7722              // 0x46000000
7723              unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7724              unsigned rm = (instr >> 19) & 0xf;
7725              // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
7726              mov(CurrentCond(), Narrow, Register(rd), Register(rm));
7727              break;
7728            }
7729            case 0x07000000: {
7730              // 0x47000000
7731              switch (instr & 0x00800000) {
7732                case 0x00000000: {
7733                  // 0x47000000
7734                  unsigned rm = (instr >> 19) & 0xf;
7735                  // BX{<c>}{<q>} <Rm> ; T1
7736                  bx(CurrentCond(), Register(rm));
7737                  if (((instr & 0xff870000) != 0x47000000)) {
7738                    UnpredictableT32(instr);
7739                  }
7740                  break;
7741                }
7742                case 0x00800000: {
7743                  // 0x47800000
7744                  unsigned rm = (instr >> 19) & 0xf;
7745                  // BLX{<c>}{<q>} <Rm> ; T1
7746                  blx(CurrentCond(), Register(rm));
7747                  if (((instr & 0xff870000) != 0x47800000)) {
7748                    UnpredictableT32(instr);
7749                  }
7750                  break;
7751                }
7752              }
7753              break;
7754            }
7755          }
7756          break;
7757        }
7758        case 0x08000000: {
7759          // 0x48000000
7760          unsigned rt = (instr >> 24) & 0x7;
7761          int32_t imm = ((instr >> 16) & 0xff) << 2;
7762          Location location(imm, kT32PcDelta);
7763          // LDR{<c>}{<q>} <Rt>, <label> ; T1
7764          ldr(CurrentCond(), Narrow, Register(rt), &location);
7765          break;
7766        }
7767        case 0x10000000: {
7768          // 0x50000000
7769          switch (instr & 0x06000000) {
7770            case 0x00000000: {
7771              // 0x50000000
7772              unsigned rt = (instr >> 16) & 0x7;
7773              unsigned rn = (instr >> 19) & 0x7;
7774              Sign sign(plus);
7775              unsigned rm = (instr >> 22) & 0x7;
7776              AddrMode addrmode = Offset;
7777              // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7778              str(CurrentCond(),
7779                  Narrow,
7780                  Register(rt),
7781                  MemOperand(Register(rn), sign, Register(rm), addrmode));
7782              break;
7783            }
7784            case 0x02000000: {
7785              // 0x52000000
7786              unsigned rt = (instr >> 16) & 0x7;
7787              unsigned rn = (instr >> 19) & 0x7;
7788              Sign sign(plus);
7789              unsigned rm = (instr >> 22) & 0x7;
7790              AddrMode addrmode = Offset;
7791              // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7792              strh(CurrentCond(),
7793                   Narrow,
7794                   Register(rt),
7795                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7796              break;
7797            }
7798            case 0x04000000: {
7799              // 0x54000000
7800              unsigned rt = (instr >> 16) & 0x7;
7801              unsigned rn = (instr >> 19) & 0x7;
7802              Sign sign(plus);
7803              unsigned rm = (instr >> 22) & 0x7;
7804              AddrMode addrmode = Offset;
7805              // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7806              strb(CurrentCond(),
7807                   Narrow,
7808                   Register(rt),
7809                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7810              break;
7811            }
7812            case 0x06000000: {
7813              // 0x56000000
7814              unsigned rt = (instr >> 16) & 0x7;
7815              unsigned rn = (instr >> 19) & 0x7;
7816              Sign sign(plus);
7817              unsigned rm = (instr >> 22) & 0x7;
7818              AddrMode addrmode = Offset;
7819              // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7820              ldrsb(CurrentCond(),
7821                    Narrow,
7822                    Register(rt),
7823                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7824              break;
7825            }
7826          }
7827          break;
7828        }
7829        case 0x18000000: {
7830          // 0x58000000
7831          switch (instr & 0x06000000) {
7832            case 0x00000000: {
7833              // 0x58000000
7834              unsigned rt = (instr >> 16) & 0x7;
7835              unsigned rn = (instr >> 19) & 0x7;
7836              Sign sign(plus);
7837              unsigned rm = (instr >> 22) & 0x7;
7838              AddrMode addrmode = Offset;
7839              // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7840              ldr(CurrentCond(),
7841                  Narrow,
7842                  Register(rt),
7843                  MemOperand(Register(rn), sign, Register(rm), addrmode));
7844              break;
7845            }
7846            case 0x02000000: {
7847              // 0x5a000000
7848              unsigned rt = (instr >> 16) & 0x7;
7849              unsigned rn = (instr >> 19) & 0x7;
7850              Sign sign(plus);
7851              unsigned rm = (instr >> 22) & 0x7;
7852              AddrMode addrmode = Offset;
7853              // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7854              ldrh(CurrentCond(),
7855                   Narrow,
7856                   Register(rt),
7857                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7858              break;
7859            }
7860            case 0x04000000: {
7861              // 0x5c000000
7862              unsigned rt = (instr >> 16) & 0x7;
7863              unsigned rn = (instr >> 19) & 0x7;
7864              Sign sign(plus);
7865              unsigned rm = (instr >> 22) & 0x7;
7866              AddrMode addrmode = Offset;
7867              // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7868              ldrb(CurrentCond(),
7869                   Narrow,
7870                   Register(rt),
7871                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7872              break;
7873            }
7874            case 0x06000000: {
7875              // 0x5e000000
7876              unsigned rt = (instr >> 16) & 0x7;
7877              unsigned rn = (instr >> 19) & 0x7;
7878              Sign sign(plus);
7879              unsigned rm = (instr >> 22) & 0x7;
7880              AddrMode addrmode = Offset;
7881              // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7882              ldrsh(CurrentCond(),
7883                    Narrow,
7884                    Register(rt),
7885                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7886              break;
7887            }
7888          }
7889          break;
7890        }
7891      }
7892      break;
7893    }
7894    case 0x60000000: {
7895      // 0x60000000
7896      switch (instr & 0x18000000) {
7897        case 0x00000000: {
7898          // 0x60000000
7899          unsigned rt = (instr >> 16) & 0x7;
7900          unsigned rn = (instr >> 19) & 0x7;
7901          int32_t offset = ((instr >> 22) & 0x1f) << 2;
7902          // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7903          str(CurrentCond(),
7904              Narrow,
7905              Register(rt),
7906              MemOperand(Register(rn), plus, offset, Offset));
7907          break;
7908        }
7909        case 0x08000000: {
7910          // 0x68000000
7911          unsigned rt = (instr >> 16) & 0x7;
7912          unsigned rn = (instr >> 19) & 0x7;
7913          int32_t offset = ((instr >> 22) & 0x1f) << 2;
7914          // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7915          ldr(CurrentCond(),
7916              Narrow,
7917              Register(rt),
7918              MemOperand(Register(rn), plus, offset, Offset));
7919          break;
7920        }
7921        case 0x10000000: {
7922          // 0x70000000
7923          unsigned rt = (instr >> 16) & 0x7;
7924          unsigned rn = (instr >> 19) & 0x7;
7925          int32_t offset = (instr >> 22) & 0x1f;
7926          // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7927          strb(CurrentCond(),
7928               Narrow,
7929               Register(rt),
7930               MemOperand(Register(rn), plus, offset, Offset));
7931          break;
7932        }
7933        case 0x18000000: {
7934          // 0x78000000
7935          unsigned rt = (instr >> 16) & 0x7;
7936          unsigned rn = (instr >> 19) & 0x7;
7937          int32_t offset = (instr >> 22) & 0x1f;
7938          // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7939          ldrb(CurrentCond(),
7940               Narrow,
7941               Register(rt),
7942               MemOperand(Register(rn), plus, offset, Offset));
7943          break;
7944        }
7945      }
7946      break;
7947    }
7948    case 0x80000000: {
7949      // 0x80000000
7950      switch (instr & 0x18000000) {
7951        case 0x00000000: {
7952          // 0x80000000
7953          unsigned rt = (instr >> 16) & 0x7;
7954          unsigned rn = (instr >> 19) & 0x7;
7955          int32_t offset = ((instr >> 22) & 0x1f) << 1;
7956          // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7957          strh(CurrentCond(),
7958               Narrow,
7959               Register(rt),
7960               MemOperand(Register(rn), plus, offset, Offset));
7961          break;
7962        }
7963        case 0x08000000: {
7964          // 0x88000000
7965          unsigned rt = (instr >> 16) & 0x7;
7966          unsigned rn = (instr >> 19) & 0x7;
7967          int32_t offset = ((instr >> 22) & 0x1f) << 1;
7968          // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7969          ldrh(CurrentCond(),
7970               Narrow,
7971               Register(rt),
7972               MemOperand(Register(rn), plus, offset, Offset));
7973          break;
7974        }
7975        case 0x10000000: {
7976          // 0x90000000
7977          unsigned rt = (instr >> 24) & 0x7;
7978          int32_t offset = ((instr >> 16) & 0xff) << 2;
7979          // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
7980          str(CurrentCond(),
7981              Narrow,
7982              Register(rt),
7983              MemOperand(sp, plus, offset, Offset));
7984          break;
7985        }
7986        case 0x18000000: {
7987          // 0x98000000
7988          unsigned rt = (instr >> 24) & 0x7;
7989          int32_t offset = ((instr >> 16) & 0xff) << 2;
7990          // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
7991          ldr(CurrentCond(),
7992              Narrow,
7993              Register(rt),
7994              MemOperand(sp, plus, offset, Offset));
7995          break;
7996        }
7997      }
7998      break;
7999    }
8000    case 0xa0000000: {
8001      // 0xa0000000
8002      switch (instr & 0x18000000) {
8003        case 0x00000000: {
8004          // 0xa0000000
8005          unsigned rd = (instr >> 24) & 0x7;
8006          int32_t imm = ((instr >> 16) & 0xff) << 2;
8007          Location location(imm, kT32PcDelta);
8008          // ADR{<c>}{<q>} <Rd>, <label> ; T1
8009          adr(CurrentCond(), Narrow, Register(rd), &location);
8010          break;
8011        }
8012        case 0x08000000: {
8013          // 0xa8000000
8014          unsigned rd = (instr >> 24) & 0x7;
8015          uint32_t imm = ((instr >> 16) & 0xff) << 2;
8016          // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
8017          add(CurrentCond(), Narrow, Register(rd), sp, imm);
8018          break;
8019        }
8020        case 0x10000000: {
8021          // 0xb0000000
8022          switch (instr & 0x04000000) {
8023            case 0x00000000: {
8024              // 0xb0000000
8025              switch (instr & 0x01000000) {
8026                case 0x00000000: {
8027                  // 0xb0000000
8028                  switch (instr & 0x02800000) {
8029                    case 0x00000000: {
8030                      // 0xb0000000
8031                      uint32_t imm = ((instr >> 16) & 0x7f) << 2;
8032                      // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2
8033                      add(CurrentCond(), Narrow, sp, sp, imm);
8034                      break;
8035                    }
8036                    case 0x00800000: {
8037                      // 0xb0800000
8038                      uint32_t imm = ((instr >> 16) & 0x7f) << 2;
8039                      // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1
8040                      sub(CurrentCond(), Narrow, sp, sp, imm);
8041                      break;
8042                    }
8043                    case 0x02000000: {
8044                      // 0xb2000000
8045                      switch (instr & 0x00400000) {
8046                        case 0x00000000: {
8047                          // 0xb2000000
8048                          unsigned rd = (instr >> 16) & 0x7;
8049                          unsigned rm = (instr >> 19) & 0x7;
8050                          // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
8051                          sxth(CurrentCond(),
8052                               Narrow,
8053                               Register(rd),
8054                               Register(rm));
8055                          break;
8056                        }
8057                        case 0x00400000: {
8058                          // 0xb2400000
8059                          unsigned rd = (instr >> 16) & 0x7;
8060                          unsigned rm = (instr >> 19) & 0x7;
8061                          // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
8062                          sxtb(CurrentCond(),
8063                               Narrow,
8064                               Register(rd),
8065                               Register(rm));
8066                          break;
8067                        }
8068                      }
8069                      break;
8070                    }
8071                    case 0x02800000: {
8072                      // 0xb2800000
8073                      switch (instr & 0x00400000) {
8074                        case 0x00000000: {
8075                          // 0xb2800000
8076                          unsigned rd = (instr >> 16) & 0x7;
8077                          unsigned rm = (instr >> 19) & 0x7;
8078                          // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
8079                          uxth(CurrentCond(),
8080                               Narrow,
8081                               Register(rd),
8082                               Register(rm));
8083                          break;
8084                        }
8085                        case 0x00400000: {
8086                          // 0xb2c00000
8087                          unsigned rd = (instr >> 16) & 0x7;
8088                          unsigned rm = (instr >> 19) & 0x7;
8089                          // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
8090                          uxtb(CurrentCond(),
8091                               Narrow,
8092                               Register(rd),
8093                               Register(rm));
8094                          break;
8095                        }
8096                      }
8097                      break;
8098                    }
8099                  }
8100                  break;
8101                }
8102                case 0x01000000: {
8103                  // 0xb1000000
8104                  unsigned rn = (instr >> 16) & 0x7;
8105                  int32_t imm =
8106                      (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
8107                  Location location(imm, kT32PcDelta);
8108                  // CBZ{<q>} <Rn>, <label> ; T1
8109                  cbz(Register(rn), &location);
8110                  break;
8111                }
8112              }
8113              break;
8114            }
8115            case 0x04000000: {
8116              // 0xb4000000
8117              switch (instr & 0x02000000) {
8118                case 0x00000000: {
8119                  // 0xb4000000
8120                  RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) |
8121                                         ((instr >> 16) & 0xff));
8122                  // PUSH{<c>}{<q>} <registers> ; T1
8123                  push(CurrentCond(), Narrow, registers);
8124                  break;
8125                }
8126                case 0x02000000: {
8127                  // 0xb6000000
8128                  switch (instr & 0x01e00000) {
8129                    case 0x00400000: {
8130                      // 0xb6400000
8131                      UnimplementedT32_16("SETEND", instr);
8132                      break;
8133                    }
8134                    case 0x00600000: {
8135                      // 0xb6600000
8136                      switch (instr & 0x00100000) {
8137                        case 0x00000000: {
8138                          // 0xb6600000
8139                          UnimplementedT32_16("CPSIE", instr);
8140                          break;
8141                        }
8142                        case 0x00100000: {
8143                          // 0xb6700000
8144                          UnimplementedT32_16("CPSID", instr);
8145                          break;
8146                        }
8147                      }
8148                      break;
8149                    }
8150                    default:
8151                      UnallocatedT32(instr);
8152                      break;
8153                  }
8154                  break;
8155                }
8156              }
8157              break;
8158            }
8159          }
8160          break;
8161        }
8162        case 0x18000000: {
8163          // 0xb8000000
8164          switch (instr & 0x04000000) {
8165            case 0x00000000: {
8166              // 0xb8000000
8167              switch (instr & 0x01000000) {
8168                case 0x00000000: {
8169                  // 0xb8000000
8170                  switch (instr & 0x02c00000) {
8171                    case 0x02000000: {
8172                      // 0xba000000
8173                      unsigned rd = (instr >> 16) & 0x7;
8174                      unsigned rm = (instr >> 19) & 0x7;
8175                      // REV{<c>}{<q>} <Rd>, <Rm> ; T1
8176                      rev(CurrentCond(), Narrow, Register(rd), Register(rm));
8177                      break;
8178                    }
8179                    case 0x02400000: {
8180                      // 0xba400000
8181                      unsigned rd = (instr >> 16) & 0x7;
8182                      unsigned rm = (instr >> 19) & 0x7;
8183                      // REV16{<c>}{<q>} <Rd>, <Rm> ; T1
8184                      rev16(CurrentCond(), Narrow, Register(rd), Register(rm));
8185                      break;
8186                    }
8187                    case 0x02800000: {
8188                      // 0xba800000
8189                      uint32_t imm = (instr >> 16) & 0x3f;
8190                      // HLT{<q>} {#}<imm> ; T1
8191                      hlt(Condition::None(), imm);
8192                      break;
8193                    }
8194                    case 0x02c00000: {
8195                      // 0xbac00000
8196                      unsigned rd = (instr >> 16) & 0x7;
8197                      unsigned rm = (instr >> 19) & 0x7;
8198                      // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1
8199                      revsh(CurrentCond(), Narrow, Register(rd), Register(rm));
8200                      break;
8201                    }
8202                    default:
8203                      UnallocatedT32(instr);
8204                      break;
8205                  }
8206                  break;
8207                }
8208                case 0x01000000: {
8209                  // 0xb9000000
8210                  unsigned rn = (instr >> 16) & 0x7;
8211                  int32_t imm =
8212                      (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
8213                  Location location(imm, kT32PcDelta);
8214                  // CBNZ{<q>} <Rn>, <label> ; T1
8215                  cbnz(Register(rn), &location);
8216                  break;
8217                }
8218              }
8219              break;
8220            }
8221            case 0x04000000: {
8222              // 0xbc000000
8223              switch (instr & 0x02000000) {
8224                case 0x00000000: {
8225                  // 0xbc000000
8226                  RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) |
8227                                         ((instr >> 16) & 0xff));
8228                  // POP{<c>}{<q>} <registers> ; T1
8229                  pop(CurrentCond(), Narrow, registers);
8230                  break;
8231                }
8232                case 0x02000000: {
8233                  // 0xbe000000
8234                  switch (instr & 0x01000000) {
8235                    case 0x00000000: {
8236                      // 0xbe000000
8237                      uint32_t imm = (instr >> 16) & 0xff;
8238                      // BKPT{<q>} {#}<imm> ; T1
8239                      bkpt(Condition::None(), imm);
8240                      break;
8241                    }
8242                    case 0x01000000: {
8243                      // 0xbf000000
8244                      switch (instr & 0x000f0000) {
8245                        case 0x00000000: {
8246                          // 0xbf000000
8247                          switch (instr & 0x00f00000) {
8248                            case 0x00000000: {
8249                              // 0xbf000000
8250                              // NOP{<c>}{<q>} ; T1
8251                              nop(CurrentCond(), Narrow);
8252                              break;
8253                            }
8254                            case 0x00100000: {
8255                              // 0xbf100000
8256                              // YIELD{<c>}{<q>} ; T1
8257                              yield(CurrentCond(), Narrow);
8258                              break;
8259                            }
8260                            case 0x00200000: {
8261                              // 0xbf200000
8262                              UnimplementedT32_16("WFE", instr);
8263                              break;
8264                            }
8265                            case 0x00300000: {
8266                              // 0xbf300000
8267                              UnimplementedT32_16("WFI", instr);
8268                              break;
8269                            }
8270                            case 0x00400000: {
8271                              // 0xbf400000
8272                              UnimplementedT32_16("SEV", instr);
8273                              break;
8274                            }
8275                            case 0x00500000: {
8276                              // 0xbf500000
8277                              UnimplementedT32_16("SEVL", instr);
8278                              break;
8279                            }
8280                            default:
8281                              UnallocatedT32(instr);
8282                              break;
8283                          }
8284                          break;
8285                        }
8286                        default: {
8287                          if (((instr & 0xf0000) == 0x0)) {
8288                            UnallocatedT32(instr);
8289                            return;
8290                          }
8291                          unsigned first_cond = (instr >> 20) & 0xf;
8292                          unsigned mask = (instr >> 16) & 0xf;
8293                          bool was_in_it_block = InITBlock();
8294                          SetIT(Condition(first_cond), mask);
8295                          it(Condition(first_cond), mask);
8296                          if (was_in_it_block || (first_cond == 15) ||
8297                              ((first_cond == al) &&
8298                               (BitCount(Uint32(mask)) != 1))) {
8299                            UnpredictableT32(instr);
8300                          }
8301                          break;
8302                        }
8303                      }
8304                      break;
8305                    }
8306                  }
8307                  break;
8308                }
8309              }
8310              break;
8311            }
8312          }
8313          break;
8314        }
8315      }
8316      break;
8317    }
8318    case 0xc0000000: {
8319      // 0xc0000000
8320      switch (instr & 0x10000000) {
8321        case 0x00000000: {
8322          // 0xc0000000
8323          switch (instr & 0x08000000) {
8324            case 0x00000000: {
8325              // 0xc0000000
8326              unsigned rn = (instr >> 24) & 0x7;
8327              RegisterList registers(((instr >> 16) & 0xff));
8328              // STM{<c>}{<q>} <Rn>!, <registers> ; T1
8329              stm(CurrentCond(),
8330                  Narrow,
8331                  Register(rn),
8332                  WriteBack(WRITE_BACK),
8333                  registers);
8334              break;
8335            }
8336            case 0x08000000: {
8337              // 0xc8000000
8338              unsigned rn = (instr >> 24) & 0x7;
8339              RegisterList registers(((instr >> 16) & 0xff));
8340              // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1
8341              ldm(CurrentCond(),
8342                  Narrow,
8343                  Register(rn),
8344                  WriteBack(!registers.Includes(Register(rn))),
8345                  registers);
8346              break;
8347            }
8348          }
8349          break;
8350        }
8351        case 0x10000000: {
8352          // 0xd0000000
8353          switch (instr & 0x0e000000) {
8354            case 0x0e000000: {
8355              // 0xde000000
8356              switch (instr & 0x01000000) {
8357                case 0x00000000: {
8358                  // 0xde000000
8359                  uint32_t imm = (instr >> 16) & 0xff;
8360                  // UDF{<c>}{<q>} {#}<imm> ; T1
8361                  udf(CurrentCond(), Narrow, imm);
8362                  break;
8363                }
8364                case 0x01000000: {
8365                  // 0xdf000000
8366                  uint32_t imm = (instr >> 16) & 0xff;
8367                  // SVC{<c>}{<q>} {#}<imm> ; T1
8368                  svc(CurrentCond(), imm);
8369                  break;
8370                }
8371              }
8372              break;
8373            }
8374            default: {
8375              if (((instr & 0xe000000) == 0xe000000)) {
8376                UnallocatedT32(instr);
8377                return;
8378              }
8379              Condition condition((instr >> 24) & 0xf);
8380              int32_t imm = SignExtend<int32_t>(((instr >> 16) & 0xff) << 1, 9);
8381              Location location(imm, kT32PcDelta);
8382              // B<c>{<q>} <label> ; T1
8383              b(condition, Narrow, &location);
8384              if (InITBlock()) {
8385                UnpredictableT32(instr);
8386              }
8387              break;
8388            }
8389          }
8390          break;
8391        }
8392      }
8393      break;
8394    }
8395    case 0xe0000000: {
8396      // 0xe0000000
8397      switch (instr & 0x08000000) {
8398        case 0x00000000: {
8399          // 0xe0000000
8400          switch (instr & 0x10000000) {
8401            case 0x00000000: {
8402              // 0xe0000000
8403              int32_t imm =
8404                  SignExtend<int32_t>(((instr >> 16) & 0x7ff) << 1, 12);
8405              Location location(imm, kT32PcDelta);
8406              // B{<c>}{<q>} <label> ; T2
8407              b(CurrentCond(), Narrow, &location);
8408              if (!OutsideITBlockOrLast()) {
8409                UnpredictableT32(instr);
8410              }
8411              break;
8412            }
8413            case 0x10000000: {
8414              // 0xf0000000
8415              switch (instr & 0x00008000) {
8416                case 0x00000000: {
8417                  // 0xf0000000
8418                  switch (instr & 0x03f00000) {
8419                    case 0x00000000: {
8420                      // 0xf0000000
8421                      unsigned rd = (instr >> 8) & 0xf;
8422                      unsigned rn = (instr >> 16) & 0xf;
8423                      uint32_t imm = ImmediateT32::Decode(
8424                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8425                          ((instr >> 15) & 0x800));
8426                      // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8427                      and_(CurrentCond(),
8428                           Best,
8429                           Register(rd),
8430                           Register(rn),
8431                           imm);
8432                      break;
8433                    }
8434                    case 0x00100000: {
8435                      // 0xf0100000
8436                      switch (instr & 0x00000f00) {
8437                        case 0x00000f00: {
8438                          // 0xf0100f00
8439                          unsigned rn = (instr >> 16) & 0xf;
8440                          uint32_t imm = ImmediateT32::Decode(
8441                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8442                              ((instr >> 15) & 0x800));
8443                          // TST{<c>}{<q>} <Rn>, #<const> ; T1
8444                          tst(CurrentCond(), Best, Register(rn), imm);
8445                          break;
8446                        }
8447                        default: {
8448                          if (((instr & 0xf00) == 0xf00)) {
8449                            UnallocatedT32(instr);
8450                            return;
8451                          }
8452                          unsigned rd = (instr >> 8) & 0xf;
8453                          unsigned rn = (instr >> 16) & 0xf;
8454                          uint32_t imm = ImmediateT32::Decode(
8455                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8456                              ((instr >> 15) & 0x800));
8457                          // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8458                          ands(CurrentCond(),
8459                               Best,
8460                               Register(rd),
8461                               Register(rn),
8462                               imm);
8463                          break;
8464                        }
8465                      }
8466                      break;
8467                    }
8468                    case 0x00200000: {
8469                      // 0xf0200000
8470                      unsigned rd = (instr >> 8) & 0xf;
8471                      unsigned rn = (instr >> 16) & 0xf;
8472                      uint32_t imm = ImmediateT32::Decode(
8473                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8474                          ((instr >> 15) & 0x800));
8475                      // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8476                      bic(CurrentCond(), Best, Register(rd), Register(rn), imm);
8477                      break;
8478                    }
8479                    case 0x00300000: {
8480                      // 0xf0300000
8481                      unsigned rd = (instr >> 8) & 0xf;
8482                      unsigned rn = (instr >> 16) & 0xf;
8483                      uint32_t imm = ImmediateT32::Decode(
8484                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8485                          ((instr >> 15) & 0x800));
8486                      // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8487                      bics(CurrentCond(),
8488                           Best,
8489                           Register(rd),
8490                           Register(rn),
8491                           imm);
8492                      break;
8493                    }
8494                    case 0x00400000: {
8495                      // 0xf0400000
8496                      switch (instr & 0x000f0000) {
8497                        case 0x000f0000: {
8498                          // 0xf04f0000
8499                          unsigned rd = (instr >> 8) & 0xf;
8500                          uint32_t imm = ImmediateT32::Decode(
8501                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8502                              ((instr >> 15) & 0x800));
8503                          if (InITBlock() &&
8504                              (instr & 0x00100000) == 0x00000000 &&
8505                              ((rd < kNumberOfT32LowRegisters) &&
8506                               (imm <= 255))) {
8507                            // MOV<c>.W <Rd>, #<const> ; T2
8508                            mov(CurrentCond(), Wide, Register(rd), imm);
8509                          } else if ((instr & 0x00100000) == 0x00000000) {
8510                            // MOV{<c>}{<q>} <Rd>, #<const> ; T2
8511                            mov(CurrentCond(), Best, Register(rd), imm);
8512                          } else {
8513                            UnallocatedT32(instr);
8514                          }
8515                          break;
8516                        }
8517                        default: {
8518                          if (((instr & 0xf0000) == 0xf0000)) {
8519                            UnallocatedT32(instr);
8520                            return;
8521                          }
8522                          unsigned rd = (instr >> 8) & 0xf;
8523                          unsigned rn = (instr >> 16) & 0xf;
8524                          uint32_t imm = ImmediateT32::Decode(
8525                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8526                              ((instr >> 15) & 0x800));
8527                          // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8528                          orr(CurrentCond(),
8529                              Best,
8530                              Register(rd),
8531                              Register(rn),
8532                              imm);
8533                          break;
8534                        }
8535                      }
8536                      break;
8537                    }
8538                    case 0x00500000: {
8539                      // 0xf0500000
8540                      switch (instr & 0x000f0000) {
8541                        case 0x000f0000: {
8542                          // 0xf05f0000
8543                          unsigned rd = (instr >> 8) & 0xf;
8544                          uint32_t imm = ImmediateT32::Decode(
8545                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8546                              ((instr >> 15) & 0x800));
8547                          if (OutsideITBlock() &&
8548                              (instr & 0x00100000) == 0x00100000 &&
8549                              ((rd < kNumberOfT32LowRegisters) &&
8550                               (imm <= 255))) {
8551                            // MOVS.W <Rd>, #<const> ; T2
8552                            movs(Condition::None(), Wide, Register(rd), imm);
8553                          } else if ((instr & 0x00100000) == 0x00100000) {
8554                            // MOVS{<c>}{<q>} <Rd>, #<const> ; T2
8555                            movs(CurrentCond(), Best, Register(rd), imm);
8556                          } else {
8557                            UnallocatedT32(instr);
8558                          }
8559                          break;
8560                        }
8561                        default: {
8562                          if (((instr & 0xf0000) == 0xf0000)) {
8563                            UnallocatedT32(instr);
8564                            return;
8565                          }
8566                          unsigned rd = (instr >> 8) & 0xf;
8567                          unsigned rn = (instr >> 16) & 0xf;
8568                          uint32_t imm = ImmediateT32::Decode(
8569                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8570                              ((instr >> 15) & 0x800));
8571                          // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8572                          orrs(CurrentCond(),
8573                               Best,
8574                               Register(rd),
8575                               Register(rn),
8576                               imm);
8577                          break;
8578                        }
8579                      }
8580                      break;
8581                    }
8582                    case 0x00600000: {
8583                      // 0xf0600000
8584                      switch (instr & 0x000f0000) {
8585                        case 0x000f0000: {
8586                          // 0xf06f0000
8587                          unsigned rd = (instr >> 8) & 0xf;
8588                          uint32_t imm = ImmediateT32::Decode(
8589                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8590                              ((instr >> 15) & 0x800));
8591                          // MVN{<c>}{<q>} <Rd>, #<const> ; T1
8592                          mvn(CurrentCond(), Best, Register(rd), imm);
8593                          break;
8594                        }
8595                        default: {
8596                          if (((instr & 0xf0000) == 0xf0000)) {
8597                            UnallocatedT32(instr);
8598                            return;
8599                          }
8600                          unsigned rd = (instr >> 8) & 0xf;
8601                          unsigned rn = (instr >> 16) & 0xf;
8602                          uint32_t imm = ImmediateT32::Decode(
8603                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8604                              ((instr >> 15) & 0x800));
8605                          // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8606                          orn(CurrentCond(), Register(rd), Register(rn), imm);
8607                          break;
8608                        }
8609                      }
8610                      break;
8611                    }
8612                    case 0x00700000: {
8613                      // 0xf0700000
8614                      switch (instr & 0x000f0000) {
8615                        case 0x000f0000: {
8616                          // 0xf07f0000
8617                          unsigned rd = (instr >> 8) & 0xf;
8618                          uint32_t imm = ImmediateT32::Decode(
8619                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8620                              ((instr >> 15) & 0x800));
8621                          // MVNS{<c>}{<q>} <Rd>, #<const> ; T1
8622                          mvns(CurrentCond(), Best, Register(rd), imm);
8623                          break;
8624                        }
8625                        default: {
8626                          if (((instr & 0xf0000) == 0xf0000)) {
8627                            UnallocatedT32(instr);
8628                            return;
8629                          }
8630                          unsigned rd = (instr >> 8) & 0xf;
8631                          unsigned rn = (instr >> 16) & 0xf;
8632                          uint32_t imm = ImmediateT32::Decode(
8633                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8634                              ((instr >> 15) & 0x800));
8635                          // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8636                          orns(CurrentCond(), Register(rd), Register(rn), imm);
8637                          break;
8638                        }
8639                      }
8640                      break;
8641                    }
8642                    case 0x00800000: {
8643                      // 0xf0800000
8644                      unsigned rd = (instr >> 8) & 0xf;
8645                      unsigned rn = (instr >> 16) & 0xf;
8646                      uint32_t imm = ImmediateT32::Decode(
8647                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8648                          ((instr >> 15) & 0x800));
8649                      // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8650                      eor(CurrentCond(), Best, Register(rd), Register(rn), imm);
8651                      break;
8652                    }
8653                    case 0x00900000: {
8654                      // 0xf0900000
8655                      switch (instr & 0x00000f00) {
8656                        case 0x00000f00: {
8657                          // 0xf0900f00
8658                          unsigned rn = (instr >> 16) & 0xf;
8659                          uint32_t imm = ImmediateT32::Decode(
8660                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8661                              ((instr >> 15) & 0x800));
8662                          // TEQ{<c>}{<q>} <Rn>, #<const> ; T1
8663                          teq(CurrentCond(), Register(rn), imm);
8664                          break;
8665                        }
8666                        default: {
8667                          if (((instr & 0xf00) == 0xf00)) {
8668                            UnallocatedT32(instr);
8669                            return;
8670                          }
8671                          unsigned rd = (instr >> 8) & 0xf;
8672                          unsigned rn = (instr >> 16) & 0xf;
8673                          uint32_t imm = ImmediateT32::Decode(
8674                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8675                              ((instr >> 15) & 0x800));
8676                          // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8677                          eors(CurrentCond(),
8678                               Best,
8679                               Register(rd),
8680                               Register(rn),
8681                               imm);
8682                          break;
8683                        }
8684                      }
8685                      break;
8686                    }
8687                    case 0x01000000: {
8688                      // 0xf1000000
8689                      switch (instr & 0x000f0000) {
8690                        case 0x000d0000: {
8691                          // 0xf10d0000
8692                          unsigned rd = (instr >> 8) & 0xf;
8693                          uint32_t imm = ImmediateT32::Decode(
8694                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8695                              ((instr >> 15) & 0x800));
8696                          if ((instr & 0x00100000) == 0x00000000 &&
8697                              (((rd < kNumberOfT32LowRegisters) &&
8698                                ((imm <= 1020) && ((imm & 3) == 0))) ||
8699                               ((rd == sp.GetCode()) &&
8700                                ((imm <= 508) && ((imm & 3) == 0))))) {
8701                            // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3
8702                            add(CurrentCond(), Wide, Register(rd), sp, imm);
8703                          } else if ((instr & 0x00100000) == 0x00000000) {
8704                            // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
8705                            add(CurrentCond(), Best, Register(rd), sp, imm);
8706                          } else {
8707                            UnallocatedT32(instr);
8708                          }
8709                          break;
8710                        }
8711                        default: {
8712                          if (((instr & 0xf0000) == 0xd0000)) {
8713                            UnallocatedT32(instr);
8714                            return;
8715                          }
8716                          unsigned rd = (instr >> 8) & 0xf;
8717                          unsigned rn = (instr >> 16) & 0xf;
8718                          uint32_t imm = ImmediateT32::Decode(
8719                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8720                              ((instr >> 15) & 0x800));
8721                          if (InITBlock() &&
8722                              (instr & 0x00100000) == 0x00000000 &&
8723                              (((rd < kNumberOfT32LowRegisters) &&
8724                                (rn < kNumberOfT32LowRegisters) &&
8725                                (imm <= 7)) ||
8726                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
8727                                (imm <= 255)))) {
8728                            // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3
8729                            add(CurrentCond(),
8730                                Wide,
8731                                Register(rd),
8732                                Register(rn),
8733                                imm);
8734                          } else if ((instr & 0x00100000) == 0x00000000) {
8735                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8736                            add(CurrentCond(),
8737                                Best,
8738                                Register(rd),
8739                                Register(rn),
8740                                imm);
8741                          } else {
8742                            UnallocatedT32(instr);
8743                          }
8744                          break;
8745                        }
8746                      }
8747                      break;
8748                    }
8749                    case 0x01100000: {
8750                      // 0xf1100000
8751                      switch (instr & 0x00000f00) {
8752                        case 0x00000f00: {
8753                          // 0xf1100f00
8754                          unsigned rn = (instr >> 16) & 0xf;
8755                          uint32_t imm = ImmediateT32::Decode(
8756                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8757                              ((instr >> 15) & 0x800));
8758                          // CMN{<c>}{<q>} <Rn>, #<const> ; T1
8759                          cmn(CurrentCond(), Best, Register(rn), imm);
8760                          break;
8761                        }
8762                        default: {
8763                          switch (instr & 0x000f0000) {
8764                            case 0x000d0000: {
8765                              // 0xf11d0000
8766                              if (((instr & 0xf00) == 0xf00)) {
8767                                UnallocatedT32(instr);
8768                                return;
8769                              }
8770                              unsigned rd = (instr >> 8) & 0xf;
8771                              uint32_t imm = ImmediateT32::Decode(
8772                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
8773                                  ((instr >> 15) & 0x800));
8774                              // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
8775                              adds(CurrentCond(), Best, Register(rd), sp, imm);
8776                              break;
8777                            }
8778                            default: {
8779                              if (((instr & 0xf0000) == 0xd0000) ||
8780                                  ((instr & 0xf00) == 0xf00)) {
8781                                UnallocatedT32(instr);
8782                                return;
8783                              }
8784                              unsigned rd = (instr >> 8) & 0xf;
8785                              unsigned rn = (instr >> 16) & 0xf;
8786                              uint32_t imm = ImmediateT32::Decode(
8787                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
8788                                  ((instr >> 15) & 0x800));
8789                              if (OutsideITBlock() &&
8790                                  (instr & 0x00100000) == 0x00100000 &&
8791                                  (((rd < kNumberOfT32LowRegisters) &&
8792                                    (rn < kNumberOfT32LowRegisters) &&
8793                                    (imm <= 7)) ||
8794                                   ((rd == rn) &&
8795                                    (rd < kNumberOfT32LowRegisters) &&
8796                                    (imm <= 255)))) {
8797                                // ADDS.W {<Rd>}, <Rn>, #<const> ; T3
8798                                adds(Condition::None(),
8799                                     Wide,
8800                                     Register(rd),
8801                                     Register(rn),
8802                                     imm);
8803                              } else if ((instr & 0x00100000) == 0x00100000) {
8804                                // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8805                                adds(CurrentCond(),
8806                                     Best,
8807                                     Register(rd),
8808                                     Register(rn),
8809                                     imm);
8810                              } else {
8811                                UnallocatedT32(instr);
8812                              }
8813                              break;
8814                            }
8815                          }
8816                          break;
8817                        }
8818                      }
8819                      break;
8820                    }
8821                    case 0x01400000: {
8822                      // 0xf1400000
8823                      unsigned rd = (instr >> 8) & 0xf;
8824                      unsigned rn = (instr >> 16) & 0xf;
8825                      uint32_t imm = ImmediateT32::Decode(
8826                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8827                          ((instr >> 15) & 0x800));
8828                      // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8829                      adc(CurrentCond(), Best, Register(rd), Register(rn), imm);
8830                      break;
8831                    }
8832                    case 0x01500000: {
8833                      // 0xf1500000
8834                      unsigned rd = (instr >> 8) & 0xf;
8835                      unsigned rn = (instr >> 16) & 0xf;
8836                      uint32_t imm = ImmediateT32::Decode(
8837                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8838                          ((instr >> 15) & 0x800));
8839                      // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8840                      adcs(CurrentCond(),
8841                           Best,
8842                           Register(rd),
8843                           Register(rn),
8844                           imm);
8845                      break;
8846                    }
8847                    case 0x01600000: {
8848                      // 0xf1600000
8849                      unsigned rd = (instr >> 8) & 0xf;
8850                      unsigned rn = (instr >> 16) & 0xf;
8851                      uint32_t imm = ImmediateT32::Decode(
8852                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8853                          ((instr >> 15) & 0x800));
8854                      // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8855                      sbc(CurrentCond(), Best, Register(rd), Register(rn), imm);
8856                      break;
8857                    }
8858                    case 0x01700000: {
8859                      // 0xf1700000
8860                      unsigned rd = (instr >> 8) & 0xf;
8861                      unsigned rn = (instr >> 16) & 0xf;
8862                      uint32_t imm = ImmediateT32::Decode(
8863                          (instr & 0xff) | ((instr >> 4) & 0x700) |
8864                          ((instr >> 15) & 0x800));
8865                      // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8866                      sbcs(CurrentCond(),
8867                           Best,
8868                           Register(rd),
8869                           Register(rn),
8870                           imm);
8871                      break;
8872                    }
8873                    case 0x01a00000: {
8874                      // 0xf1a00000
8875                      switch (instr & 0x000f0000) {
8876                        case 0x000d0000: {
8877                          // 0xf1ad0000
8878                          unsigned rd = (instr >> 8) & 0xf;
8879                          uint32_t imm = ImmediateT32::Decode(
8880                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8881                              ((instr >> 15) & 0x800));
8882                          if ((instr & 0x00100000) == 0x00000000 &&
8883                              ((rd == sp.GetCode()) &&
8884                               ((imm <= 508) && ((imm & 3) == 0)))) {
8885                            // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2
8886                            sub(CurrentCond(), Wide, Register(rd), sp, imm);
8887                          } else if ((instr & 0x00100000) == 0x00000000) {
8888                            // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
8889                            sub(CurrentCond(), Best, Register(rd), sp, imm);
8890                          } else {
8891                            UnallocatedT32(instr);
8892                          }
8893                          break;
8894                        }
8895                        default: {
8896                          if (((instr & 0xf0000) == 0xd0000)) {
8897                            UnallocatedT32(instr);
8898                            return;
8899                          }
8900                          unsigned rd = (instr >> 8) & 0xf;
8901                          unsigned rn = (instr >> 16) & 0xf;
8902                          uint32_t imm = ImmediateT32::Decode(
8903                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8904                              ((instr >> 15) & 0x800));
8905                          if (InITBlock() &&
8906                              (instr & 0x00100000) == 0x00000000 &&
8907                              (((rd < kNumberOfT32LowRegisters) &&
8908                                (rn < kNumberOfT32LowRegisters) &&
8909                                (imm <= 7)) ||
8910                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
8911                                (imm <= 255)))) {
8912                            // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3
8913                            sub(CurrentCond(),
8914                                Wide,
8915                                Register(rd),
8916                                Register(rn),
8917                                imm);
8918                          } else if ((instr & 0x00100000) == 0x00000000) {
8919                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8920                            sub(CurrentCond(),
8921                                Best,
8922                                Register(rd),
8923                                Register(rn),
8924                                imm);
8925                          } else {
8926                            UnallocatedT32(instr);
8927                          }
8928                          break;
8929                        }
8930                      }
8931                      break;
8932                    }
8933                    case 0x01b00000: {
8934                      // 0xf1b00000
8935                      switch (instr & 0x00000f00) {
8936                        case 0x00000f00: {
8937                          // 0xf1b00f00
8938                          unsigned rn = (instr >> 16) & 0xf;
8939                          uint32_t imm = ImmediateT32::Decode(
8940                              (instr & 0xff) | ((instr >> 4) & 0x700) |
8941                              ((instr >> 15) & 0x800));
8942                          if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) {
8943                            // CMP{<c>}.W <Rn>, #<const> ; T2
8944                            cmp(CurrentCond(), Wide, Register(rn), imm);
8945                          } else {
8946                            // CMP{<c>}{<q>} <Rn>, #<const> ; T2
8947                            cmp(CurrentCond(), Best, Register(rn), imm);
8948                          }
8949                          break;
8950                        }
8951                        default: {
8952                          switch (instr & 0x000f0000) {
8953                            case 0x000d0000: {
8954                              // 0xf1bd0000
8955                              if (((instr & 0xf00) == 0xf00)) {
8956                                UnallocatedT32(instr);
8957                                return;
8958                              }
8959                              unsigned rd = (instr >> 8) & 0xf;
8960                              uint32_t imm = ImmediateT32::Decode(
8961                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
8962                                  ((instr >> 15) & 0x800));
8963                              // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
8964                              subs(CurrentCond(), Best, Register(rd), sp, imm);
8965                              break;
8966                            }
8967                            default: {
8968                              if (((instr & 0xf0000) == 0xd0000) ||
8969                                  ((instr & 0xf00) == 0xf00)) {
8970                                UnallocatedT32(instr);
8971                                return;
8972                              }
8973                              unsigned rd = (instr >> 8) & 0xf;
8974                              unsigned rn = (instr >> 16) & 0xf;
8975                              uint32_t imm = ImmediateT32::Decode(
8976                                  (instr & 0xff) | ((instr >> 4) & 0x700) |
8977                                  ((instr >> 15) & 0x800));
8978                              if (OutsideITBlock() &&
8979                                  (instr & 0x00100000) == 0x00100000 &&
8980                                  (((rd < kNumberOfT32LowRegisters) &&
8981                                    (rn < kNumberOfT32LowRegisters) &&
8982                                    (imm <= 7)) ||
8983                                   ((rd == rn) &&
8984                                    (rd < kNumberOfT32LowRegisters) &&
8985                                    (imm <= 255)))) {
8986                                // SUBS.W {<Rd>}, <Rn>, #<const> ; T3
8987                                subs(Condition::None(),
8988                                     Wide,
8989                                     Register(rd),
8990                                     Register(rn),
8991                                     imm);
8992                              } else if ((instr & 0x00100000) == 0x00100000) {
8993                                // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8994                                subs(CurrentCond(),
8995                                     Best,
8996                                     Register(rd),
8997                                     Register(rn),
8998                                     imm);
8999                              } else {
9000                                UnallocatedT32(instr);
9001                              }
9002                              break;
9003                            }
9004                          }
9005                          break;
9006                        }
9007                      }
9008                      break;
9009                    }
9010                    case 0x01c00000: {
9011                      // 0xf1c00000
9012                      unsigned rd = (instr >> 8) & 0xf;
9013                      unsigned rn = (instr >> 16) & 0xf;
9014                      uint32_t imm = ImmediateT32::Decode(
9015                          (instr & 0xff) | ((instr >> 4) & 0x700) |
9016                          ((instr >> 15) & 0x800));
9017                      if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
9018                          (imm == 0) &&
9019                          ((rd < kNumberOfT32LowRegisters) &&
9020                           (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
9021                        // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2
9022                        rsb(CurrentCond(),
9023                            Wide,
9024                            Register(rd),
9025                            Register(rn),
9026                            UINT32_C(0));
9027                      } else if ((instr & 0x00100000) == 0x00000000) {
9028                        // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
9029                        rsb(CurrentCond(),
9030                            Best,
9031                            Register(rd),
9032                            Register(rn),
9033                            imm);
9034                      } else {
9035                        UnallocatedT32(instr);
9036                      }
9037                      break;
9038                    }
9039                    case 0x01d00000: {
9040                      // 0xf1d00000
9041                      unsigned rd = (instr >> 8) & 0xf;
9042                      unsigned rn = (instr >> 16) & 0xf;
9043                      uint32_t imm = ImmediateT32::Decode(
9044                          (instr & 0xff) | ((instr >> 4) & 0x700) |
9045                          ((instr >> 15) & 0x800));
9046                      if (OutsideITBlock() &&
9047                          (instr & 0x00100000) == 0x00100000 && (imm == 0) &&
9048                          ((rd < kNumberOfT32LowRegisters) &&
9049                           (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
9050                        // RSBS.W {<Rd>}, <Rn>, #0 ; T2
9051                        rsbs(Condition::None(),
9052                             Wide,
9053                             Register(rd),
9054                             Register(rn),
9055                             UINT32_C(0));
9056                      } else if ((instr & 0x00100000) == 0x00100000) {
9057                        // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
9058                        rsbs(CurrentCond(),
9059                             Best,
9060                             Register(rd),
9061                             Register(rn),
9062                             imm);
9063                      } else {
9064                        UnallocatedT32(instr);
9065                      }
9066                      break;
9067                    }
9068                    case 0x02000000: {
9069                      // 0xf2000000
9070                      switch (instr & 0x000d0000) {
9071                        case 0x000d0000: {
9072                          // 0xf20d0000
9073                          switch (instr & 0x00020000) {
9074                            case 0x00000000: {
9075                              // 0xf20d0000
9076                              unsigned rd = (instr >> 8) & 0xf;
9077                              uint32_t imm = (instr & 0xff) |
9078                                             ((instr >> 4) & 0x700) |
9079                                             ((instr >> 15) & 0x800);
9080                              if (((rd >= kNumberOfT32LowRegisters) ||
9081                                   ((imm > 1020) || ((imm & 3) != 0))) &&
9082                                  ((rd != sp.GetCode()) ||
9083                                   ((imm > 508) || ((imm & 3) != 0))) &&
9084                                  (!ImmediateT32::IsImmediateT32(imm))) {
9085                                // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
9086                                add(CurrentCond(), Best, Register(rd), sp, imm);
9087                              } else {
9088                                // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
9089                                addw(CurrentCond(), Register(rd), sp, imm);
9090                              }
9091                              break;
9092                            }
9093                            case 0x00020000: {
9094                              // 0xf20f0000
9095                              unsigned rd = (instr >> 8) & 0xf;
9096                              int32_t imm = (instr & 0xff) |
9097                                            ((instr >> 4) & 0x700) |
9098                                            ((instr >> 15) & 0x800);
9099                              Location location(imm, kT32PcDelta);
9100                              if ((imm >= 0) && (imm <= 4095) &&
9101                                  ((rd < kNumberOfT32LowRegisters) &&
9102                                   (imm >= 0) && (imm <= 1020) &&
9103                                   ((imm & 3) == 0))) {
9104                                // ADR{<c>}.W <Rd>, <label> ; T3
9105                                adr(CurrentCond(),
9106                                    Wide,
9107                                    Register(rd),
9108                                    &location);
9109                              } else if ((imm >= 0) && (imm <= 4095)) {
9110                                // ADR{<c>}{<q>} <Rd>, <label> ; T3
9111                                adr(CurrentCond(),
9112                                    Best,
9113                                    Register(rd),
9114                                    &location);
9115                              } else {
9116                                UnallocatedT32(instr);
9117                              }
9118                              break;
9119                            }
9120                          }
9121                          break;
9122                        }
9123                        default: {
9124                          if (((instr & 0xd0000) == 0xd0000)) {
9125                            UnallocatedT32(instr);
9126                            return;
9127                          }
9128                          unsigned rd = (instr >> 8) & 0xf;
9129                          unsigned rn = (instr >> 16) & 0xf;
9130                          uint32_t imm = (instr & 0xff) |
9131                                         ((instr >> 4) & 0x700) |
9132                                         ((instr >> 15) & 0x800);
9133                          if ((InITBlock() ||
9134                               (rd >= kNumberOfT32LowRegisters) ||
9135                               (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
9136                              (InITBlock() || (rd != rn) ||
9137                               (rd >= kNumberOfT32LowRegisters) ||
9138                               (imm > 255)) &&
9139                              (!ImmediateT32::IsImmediateT32(imm))) {
9140                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9141                            add(CurrentCond(),
9142                                Best,
9143                                Register(rd),
9144                                Register(rn),
9145                                imm);
9146                          } else {
9147                            // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9148                            addw(CurrentCond(),
9149                                 Register(rd),
9150                                 Register(rn),
9151                                 imm);
9152                          }
9153                          break;
9154                        }
9155                      }
9156                      break;
9157                    }
9158                    case 0x02400000: {
9159                      // 0xf2400000
9160                      unsigned rd = (instr >> 8) & 0xf;
9161                      uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
9162                                     ((instr >> 15) & 0x800) |
9163                                     ((instr >> 4) & 0xf000);
9164                      if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) ||
9165                           (imm > 255)) &&
9166                          (!ImmediateT32::IsImmediateT32(imm))) {
9167                        // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3
9168                        mov(CurrentCond(), Best, Register(rd), imm);
9169                      } else {
9170                        // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3
9171                        movw(CurrentCond(), Register(rd), imm);
9172                      }
9173                      break;
9174                    }
9175                    case 0x02a00000: {
9176                      // 0xf2a00000
9177                      switch (instr & 0x000d0000) {
9178                        case 0x000d0000: {
9179                          // 0xf2ad0000
9180                          switch (instr & 0x00020000) {
9181                            case 0x00000000: {
9182                              // 0xf2ad0000
9183                              unsigned rd = (instr >> 8) & 0xf;
9184                              uint32_t imm = (instr & 0xff) |
9185                                             ((instr >> 4) & 0x700) |
9186                                             ((instr >> 15) & 0x800);
9187                              if (((rd != sp.GetCode()) ||
9188                                   ((imm > 508) || ((imm & 3) != 0))) &&
9189                                  (!ImmediateT32::IsImmediateT32(imm))) {
9190                                // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
9191                                sub(CurrentCond(), Best, Register(rd), sp, imm);
9192                              } else {
9193                                // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
9194                                subw(CurrentCond(), Register(rd), sp, imm);
9195                              }
9196                              break;
9197                            }
9198                            case 0x00020000: {
9199                              // 0xf2af0000
9200                              if (((((Uint32((instr >> 26)) & Uint32(0x1))
9201                                     << 11) |
9202                                    ((Uint32((instr >> 12)) & Uint32(0x7))
9203                                     << 8) |
9204                                    (Uint32(instr) & Uint32(0xff))) ==
9205                                   Uint32(0x0))) {
9206                                unsigned rd = (instr >> 8) & 0xf;
9207                                uint32_t imm = (instr & 0xff) |
9208                                               ((instr >> 4) & 0x700) |
9209                                               ((instr >> 15) & 0x800);
9210                                // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2
9211                                sub(CurrentCond(), Best, Register(rd), pc, imm);
9212                                return;
9213                              }
9214                              unsigned rd = (instr >> 8) & 0xf;
9215                              int32_t imm = (instr & 0xff) |
9216                                            ((instr >> 4) & 0x700) |
9217                                            ((instr >> 15) & 0x800);
9218                              Location location(-imm, kT32PcDelta);
9219                              // ADR{<c>}{<q>} <Rd>, <label> ; T2
9220                              adr(CurrentCond(), Best, Register(rd), &location);
9221                              break;
9222                            }
9223                          }
9224                          break;
9225                        }
9226                        default: {
9227                          if (((instr & 0xd0000) == 0xd0000)) {
9228                            UnallocatedT32(instr);
9229                            return;
9230                          }
9231                          unsigned rd = (instr >> 8) & 0xf;
9232                          unsigned rn = (instr >> 16) & 0xf;
9233                          uint32_t imm = (instr & 0xff) |
9234                                         ((instr >> 4) & 0x700) |
9235                                         ((instr >> 15) & 0x800);
9236                          if ((InITBlock() ||
9237                               (rd >= kNumberOfT32LowRegisters) ||
9238                               (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
9239                              (InITBlock() || (rd != rn) ||
9240                               (rd >= kNumberOfT32LowRegisters) ||
9241                               (imm > 255)) &&
9242                              (!ImmediateT32::IsImmediateT32(imm))) {
9243                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9244                            sub(CurrentCond(),
9245                                Best,
9246                                Register(rd),
9247                                Register(rn),
9248                                imm);
9249                          } else {
9250                            // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9251                            subw(CurrentCond(),
9252                                 Register(rd),
9253                                 Register(rn),
9254                                 imm);
9255                          }
9256                          break;
9257                        }
9258                      }
9259                      break;
9260                    }
9261                    case 0x02c00000: {
9262                      // 0xf2c00000
9263                      unsigned rd = (instr >> 8) & 0xf;
9264                      uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
9265                                     ((instr >> 15) & 0x800) |
9266                                     ((instr >> 4) & 0xf000);
9267                      // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1
9268                      movt(CurrentCond(), Register(rd), imm);
9269                      break;
9270                    }
9271                    case 0x03000000: {
9272                      // 0xf3000000
9273                      unsigned rd = (instr >> 8) & 0xf;
9274                      uint32_t imm = (instr & 0x1f) + 1;
9275                      unsigned rn = (instr >> 16) & 0xf;
9276                      uint32_t amount =
9277                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9278                      // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
9279                      ssat(CurrentCond(),
9280                           Register(rd),
9281                           imm,
9282                           Operand(Register(rn), LSL, amount));
9283                      if (((instr & 0xfff08020) != 0xf3000000)) {
9284                        UnpredictableT32(instr);
9285                      }
9286                      break;
9287                    }
9288                    case 0x03200000: {
9289                      // 0xf3200000
9290                      switch (instr & 0x000070c0) {
9291                        case 0x00000000: {
9292                          // 0xf3200000
9293                          unsigned rd = (instr >> 8) & 0xf;
9294                          uint32_t imm = (instr & 0xf) + 1;
9295                          unsigned rn = (instr >> 16) & 0xf;
9296                          // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
9297                          ssat16(CurrentCond(),
9298                                 Register(rd),
9299                                 imm,
9300                                 Register(rn));
9301                          if (((instr & 0xfff0f0f0) != 0xf3200000)) {
9302                            UnpredictableT32(instr);
9303                          }
9304                          break;
9305                        }
9306                        default: {
9307                          if (((instr & 0x70c0) == 0x0)) {
9308                            UnallocatedT32(instr);
9309                            return;
9310                          }
9311                          unsigned rd = (instr >> 8) & 0xf;
9312                          uint32_t imm = (instr & 0x1f) + 1;
9313                          unsigned rn = (instr >> 16) & 0xf;
9314                          uint32_t amount =
9315                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9316                          // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
9317                          ssat(CurrentCond(),
9318                               Register(rd),
9319                               imm,
9320                               Operand(Register(rn), ASR, amount));
9321                          if (((instr & 0xfff08020) != 0xf3200000)) {
9322                            UnpredictableT32(instr);
9323                          }
9324                          break;
9325                        }
9326                      }
9327                      break;
9328                    }
9329                    case 0x03400000: {
9330                      // 0xf3400000
9331                      unsigned rd = (instr >> 8) & 0xf;
9332                      unsigned rn = (instr >> 16) & 0xf;
9333                      uint32_t lsb =
9334                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9335                      uint32_t widthm1 = instr & 0x1f;
9336                      uint32_t width = widthm1 + 1;
9337                      // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9338                      sbfx(CurrentCond(),
9339                           Register(rd),
9340                           Register(rn),
9341                           lsb,
9342                           width);
9343                      if (((instr & 0xfff08020) != 0xf3400000)) {
9344                        UnpredictableT32(instr);
9345                      }
9346                      break;
9347                    }
9348                    case 0x03600000: {
9349                      // 0xf3600000
9350                      switch (instr & 0x000f0000) {
9351                        case 0x000f0000: {
9352                          // 0xf36f0000
9353                          unsigned rd = (instr >> 8) & 0xf;
9354                          uint32_t lsb =
9355                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9356                          uint32_t msb = instr & 0x1f;
9357                          uint32_t width = msb - lsb + 1;
9358                          // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1
9359                          bfc(CurrentCond(), Register(rd), lsb, width);
9360                          if (((instr & 0xffff8020) != 0xf36f0000)) {
9361                            UnpredictableT32(instr);
9362                          }
9363                          break;
9364                        }
9365                        default: {
9366                          if (((instr & 0xf0000) == 0xf0000)) {
9367                            UnallocatedT32(instr);
9368                            return;
9369                          }
9370                          unsigned rd = (instr >> 8) & 0xf;
9371                          unsigned rn = (instr >> 16) & 0xf;
9372                          uint32_t lsb =
9373                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9374                          uint32_t msb = instr & 0x1f;
9375                          uint32_t width = msb - lsb + 1;
9376                          // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9377                          bfi(CurrentCond(),
9378                              Register(rd),
9379                              Register(rn),
9380                              lsb,
9381                              width);
9382                          if (((instr & 0xfff08020) != 0xf3600000)) {
9383                            UnpredictableT32(instr);
9384                          }
9385                          break;
9386                        }
9387                      }
9388                      break;
9389                    }
9390                    case 0x03800000: {
9391                      // 0xf3800000
9392                      unsigned rd = (instr >> 8) & 0xf;
9393                      uint32_t imm = instr & 0x1f;
9394                      unsigned rn = (instr >> 16) & 0xf;
9395                      uint32_t amount =
9396                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9397                      // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
9398                      usat(CurrentCond(),
9399                           Register(rd),
9400                           imm,
9401                           Operand(Register(rn), LSL, amount));
9402                      if (((instr & 0xfff08020) != 0xf3800000)) {
9403                        UnpredictableT32(instr);
9404                      }
9405                      break;
9406                    }
9407                    case 0x03a00000: {
9408                      // 0xf3a00000
9409                      switch (instr & 0x000070c0) {
9410                        case 0x00000000: {
9411                          // 0xf3a00000
9412                          unsigned rd = (instr >> 8) & 0xf;
9413                          uint32_t imm = instr & 0xf;
9414                          unsigned rn = (instr >> 16) & 0xf;
9415                          // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
9416                          usat16(CurrentCond(),
9417                                 Register(rd),
9418                                 imm,
9419                                 Register(rn));
9420                          if (((instr & 0xfff0f0f0) != 0xf3a00000)) {
9421                            UnpredictableT32(instr);
9422                          }
9423                          break;
9424                        }
9425                        default: {
9426                          if (((instr & 0x70c0) == 0x0)) {
9427                            UnallocatedT32(instr);
9428                            return;
9429                          }
9430                          unsigned rd = (instr >> 8) & 0xf;
9431                          uint32_t imm = instr & 0x1f;
9432                          unsigned rn = (instr >> 16) & 0xf;
9433                          uint32_t amount =
9434                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9435                          // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
9436                          usat(CurrentCond(),
9437                               Register(rd),
9438                               imm,
9439                               Operand(Register(rn), ASR, amount));
9440                          if (((instr & 0xfff08020) != 0xf3a00000)) {
9441                            UnpredictableT32(instr);
9442                          }
9443                          break;
9444                        }
9445                      }
9446                      break;
9447                    }
9448                    case 0x03c00000: {
9449                      // 0xf3c00000
9450                      unsigned rd = (instr >> 8) & 0xf;
9451                      unsigned rn = (instr >> 16) & 0xf;
9452                      uint32_t lsb =
9453                          ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9454                      uint32_t widthm1 = instr & 0x1f;
9455                      uint32_t width = widthm1 + 1;
9456                      // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9457                      ubfx(CurrentCond(),
9458                           Register(rd),
9459                           Register(rn),
9460                           lsb,
9461                           width);
9462                      if (((instr & 0xfff08020) != 0xf3c00000)) {
9463                        UnpredictableT32(instr);
9464                      }
9465                      break;
9466                    }
9467                    default:
9468                      UnallocatedT32(instr);
9469                      break;
9470                  }
9471                  break;
9472                }
9473                case 0x00008000: {
9474                  // 0xf0008000
9475                  switch (instr & 0x00005000) {
9476                    case 0x00000000: {
9477                      // 0xf0008000
9478                      switch (instr & 0x03800000) {
9479                        case 0x03800000: {
9480                          // 0xf3808000
9481                          switch (instr & 0x04600000) {
9482                            case 0x00000000: {
9483                              // 0xf3808000
9484                              switch (instr & 0x00000020) {
9485                                case 0x00000000: {
9486                                  // 0xf3808000
9487                                  unsigned spec_reg = ((instr >> 8) & 0xf) |
9488                                                      ((instr >> 16) & 0x10);
9489                                  unsigned rn = (instr >> 16) & 0xf;
9490                                  // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1
9491                                  msr(CurrentCond(),
9492                                      MaskedSpecialRegister(spec_reg),
9493                                      Register(rn));
9494                                  if (((instr & 0xffe0f0ff) != 0xf3808000)) {
9495                                    UnpredictableT32(instr);
9496                                  }
9497                                  break;
9498                                }
9499                                case 0x00000020: {
9500                                  // 0xf3808020
9501                                  UnimplementedT32_32("MSR", instr);
9502                                  break;
9503                                }
9504                              }
9505                              break;
9506                            }
9507                            case 0x00200000: {
9508                              // 0xf3a08000
9509                              switch (instr & 0x00100000) {
9510                                case 0x00000000: {
9511                                  // 0xf3a08000
9512                                  switch (instr & 0x00000700) {
9513                                    case 0x00000000: {
9514                                      // 0xf3a08000
9515                                      switch (instr & 0x000000f0) {
9516                                        case 0x00000000: {
9517                                          // 0xf3a08000
9518                                          switch (instr & 0x0000000f) {
9519                                            case 0x00000000: {
9520                                              // 0xf3a08000
9521                                              // NOP{<c>}.W ; T2
9522                                              nop(CurrentCond(), Wide);
9523                                              if (((instr & 0xffffffff) !=
9524                                                   0xf3af8000)) {
9525                                                UnpredictableT32(instr);
9526                                              }
9527                                              break;
9528                                            }
9529                                            case 0x00000001: {
9530                                              // 0xf3a08001
9531                                              // YIELD{<c>}.W ; T2
9532                                              yield(CurrentCond(), Wide);
9533                                              if (((instr & 0xffffffff) !=
9534                                                   0xf3af8001)) {
9535                                                UnpredictableT32(instr);
9536                                              }
9537                                              break;
9538                                            }
9539                                            case 0x00000002: {
9540                                              // 0xf3a08002
9541                                              UnimplementedT32_32("WFE", instr);
9542                                              break;
9543                                            }
9544                                            case 0x00000003: {
9545                                              // 0xf3a08003
9546                                              UnimplementedT32_32("WFI", instr);
9547                                              break;
9548                                            }
9549                                            case 0x00000004: {
9550                                              // 0xf3a08004
9551                                              UnimplementedT32_32("SEV", instr);
9552                                              break;
9553                                            }
9554                                            case 0x00000005: {
9555                                              // 0xf3a08005
9556                                              UnimplementedT32_32("SEVL",
9557                                                                  instr);
9558                                              break;
9559                                            }
9560                                            default:
9561                                              UnallocatedT32(instr);
9562                                              break;
9563                                          }
9564                                          break;
9565                                        }
9566                                        case 0x000000f0: {
9567                                          // 0xf3a080f0
9568                                          UnimplementedT32_32("DBG", instr);
9569                                          break;
9570                                        }
9571                                        default:
9572                                          UnallocatedT32(instr);
9573                                          break;
9574                                      }
9575                                      break;
9576                                    }
9577                                    case 0x00000100: {
9578                                      // 0xf3a08100
9579                                      if ((instr & 0x000000e0) == 0x00000000) {
9580                                        UnimplementedT32_32("CPS", instr);
9581                                      } else {
9582                                        UnallocatedT32(instr);
9583                                      }
9584                                      break;
9585                                    }
9586                                    case 0x00000400: {
9587                                      // 0xf3a08400
9588                                      if ((instr & 0x0000001f) == 0x00000000) {
9589                                        UnimplementedT32_32("CPSIE", instr);
9590                                      } else {
9591                                        UnallocatedT32(instr);
9592                                      }
9593                                      break;
9594                                    }
9595                                    case 0x00000500: {
9596                                      // 0xf3a08500
9597                                      UnimplementedT32_32("CPSIE", instr);
9598                                      break;
9599                                    }
9600                                    case 0x00000600: {
9601                                      // 0xf3a08600
9602                                      if ((instr & 0x0000001f) == 0x00000000) {
9603                                        UnimplementedT32_32("CPSID", instr);
9604                                      } else {
9605                                        UnallocatedT32(instr);
9606                                      }
9607                                      break;
9608                                    }
9609                                    case 0x00000700: {
9610                                      // 0xf3a08700
9611                                      UnimplementedT32_32("CPSID", instr);
9612                                      break;
9613                                    }
9614                                    default:
9615                                      UnallocatedT32(instr);
9616                                      break;
9617                                  }
9618                                  break;
9619                                }
9620                                case 0x00100000: {
9621                                  // 0xf3b08000
9622                                  switch (instr & 0x000000f0) {
9623                                    case 0x00000020: {
9624                                      // 0xf3b08020
9625                                      // CLREX{<c>}{<q>} ; T1
9626                                      clrex(CurrentCond());
9627                                      if (((instr & 0xffffffff) !=
9628                                           0xf3bf8f2f)) {
9629                                        UnpredictableT32(instr);
9630                                      }
9631                                      break;
9632                                    }
9633                                    case 0x00000040: {
9634                                      // 0xf3b08040
9635                                      MemoryBarrier option(instr & 0xf);
9636                                      // DSB{<c>}{<q>} {<option>} ; T1
9637                                      dsb(CurrentCond(), option);
9638                                      if (((instr & 0xfffffff0) !=
9639                                           0xf3bf8f40)) {
9640                                        UnpredictableT32(instr);
9641                                      }
9642                                      break;
9643                                    }
9644                                    case 0x00000050: {
9645                                      // 0xf3b08050
9646                                      MemoryBarrier option(instr & 0xf);
9647                                      // DMB{<c>}{<q>} {<option>} ; T1
9648                                      dmb(CurrentCond(), option);
9649                                      if (((instr & 0xfffffff0) !=
9650                                           0xf3bf8f50)) {
9651                                        UnpredictableT32(instr);
9652                                      }
9653                                      break;
9654                                    }
9655                                    case 0x00000060: {
9656                                      // 0xf3b08060
9657                                      MemoryBarrier option(instr & 0xf);
9658                                      // ISB{<c>}{<q>} {<option>} ; T1
9659                                      isb(CurrentCond(), option);
9660                                      if (((instr & 0xfffffff0) !=
9661                                           0xf3bf8f60)) {
9662                                        UnpredictableT32(instr);
9663                                      }
9664                                      break;
9665                                    }
9666                                    default:
9667                                      UnallocatedT32(instr);
9668                                      break;
9669                                  }
9670                                  break;
9671                                }
9672                              }
9673                              break;
9674                            }
9675                            case 0x00400000: {
9676                              // 0xf3c08000
9677                              switch (instr & 0x00100000) {
9678                                case 0x00000000: {
9679                                  // 0xf3c08000
9680                                  unsigned rm = (instr >> 16) & 0xf;
9681                                  // BXJ{<c>}{<q>} <Rm> ; T1
9682                                  bxj(CurrentCond(), Register(rm));
9683                                  if (((instr & 0xfff0ffff) != 0xf3c08f00)) {
9684                                    UnpredictableT32(instr);
9685                                  }
9686                                  break;
9687                                }
9688                                case 0x00100000: {
9689                                  // 0xf3d08000
9690                                  switch (instr & 0x000000ff) {
9691                                    case 0x00000000: {
9692                                      // 0xf3d08000
9693                                      if ((instr & 0x000f0000) == 0x000e0000) {
9694                                        UnimplementedT32_32("ERET", instr);
9695                                      } else {
9696                                        UnallocatedT32(instr);
9697                                      }
9698                                      break;
9699                                    }
9700                                    default: {
9701                                      if (((instr & 0xff) == 0x0)) {
9702                                        UnallocatedT32(instr);
9703                                        return;
9704                                      }
9705                                      uint32_t imm = instr & 0xff;
9706                                      // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5
9707                                      subs(CurrentCond(), Best, pc, lr, imm);
9708                                      if (((instr & 0xffffff00) !=
9709                                           0xf3de8f00)) {
9710                                        UnpredictableT32(instr);
9711                                      }
9712                                      break;
9713                                    }
9714                                  }
9715                                  break;
9716                                }
9717                              }
9718                              break;
9719                            }
9720                            case 0x00600000: {
9721                              // 0xf3e08000
9722                              switch (instr & 0x00000020) {
9723                                case 0x00000000: {
9724                                  // 0xf3e08000
9725                                  unsigned rd = (instr >> 8) & 0xf;
9726                                  unsigned spec_reg = (instr >> 20) & 0x1;
9727                                  // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1
9728                                  mrs(CurrentCond(),
9729                                      Register(rd),
9730                                      SpecialRegister(spec_reg));
9731                                  if (((instr & 0xffeff0ff) != 0xf3ef8000)) {
9732                                    UnpredictableT32(instr);
9733                                  }
9734                                  break;
9735                                }
9736                                case 0x00000020: {
9737                                  // 0xf3e08020
9738                                  UnimplementedT32_32("MRS", instr);
9739                                  break;
9740                                }
9741                              }
9742                              break;
9743                            }
9744                            case 0x04000000: {
9745                              // 0xf7808000
9746                              switch (instr & 0x001f2fff) {
9747                                case 0x000f0001: {
9748                                  // 0xf78f8001
9749                                  UnimplementedT32_32("DCPS1", instr);
9750                                  break;
9751                                }
9752                                case 0x000f0002: {
9753                                  // 0xf78f8002
9754                                  UnimplementedT32_32("DCPS2", instr);
9755                                  break;
9756                                }
9757                                case 0x000f0003: {
9758                                  // 0xf78f8003
9759                                  UnimplementedT32_32("DCPS3", instr);
9760                                  break;
9761                                }
9762                                default:
9763                                  UnallocatedT32(instr);
9764                                  break;
9765                              }
9766                              break;
9767                            }
9768                            case 0x04600000: {
9769                              // 0xf7e08000
9770                              switch (instr & 0x00102000) {
9771                                case 0x00000000: {
9772                                  // 0xf7e08000
9773                                  uint32_t imm =
9774                                      (instr & 0xfff) | ((instr >> 4) & 0xf000);
9775                                  // HVC{<q>} {#}<imm16> ; T1
9776                                  hvc(Condition::None(), imm);
9777                                  break;
9778                                }
9779                                case 0x00100000: {
9780                                  // 0xf7f08000
9781                                  UnimplementedT32_32("SMC", instr);
9782                                  break;
9783                                }
9784                                case 0x00102000: {
9785                                  // 0xf7f0a000
9786                                  uint32_t imm =
9787                                      (instr & 0xfff) | ((instr >> 4) & 0xf000);
9788                                  if ((imm <= 255)) {
9789                                    // UDF{<c>}.W {#}<imm> ; T2
9790                                    udf(CurrentCond(), Wide, imm);
9791                                  } else {
9792                                    // UDF{<c>}{<q>} {#}<imm> ; T2
9793                                    udf(CurrentCond(), Best, imm);
9794                                  }
9795                                  break;
9796                                }
9797                                default:
9798                                  UnallocatedT32(instr);
9799                                  break;
9800                              }
9801                              break;
9802                            }
9803                            default:
9804                              UnallocatedT32(instr);
9805                              break;
9806                          }
9807                          break;
9808                        }
9809                        default: {
9810                          if (((instr & 0x3800000) == 0x3800000)) {
9811                            UnallocatedT32(instr);
9812                            return;
9813                          }
9814                          Condition condition((instr >> 22) & 0xf);
9815                          int32_t imm =
9816                              SignExtend<int32_t>(((instr & 0x7ff) |
9817                                                   ((instr >> 5) & 0x1f800) |
9818                                                   ((instr << 4) & 0x20000) |
9819                                                   ((instr << 7) & 0x40000) |
9820                                                   ((instr >> 7) & 0x80000))
9821                                                      << 1,
9822                                                  21);
9823                          Location location(imm, kT32PcDelta);
9824                          if ((imm >= -1048576) && (imm <= 1048574) &&
9825                              ((imm & 1) == 0) &&
9826                              ((imm >= -256) && (imm <= 254) &&
9827                               ((imm & 1) == 0))) {
9828                            // B<c>.W <label> ; T3
9829                            b(condition, Wide, &location);
9830                            if (InITBlock()) {
9831                              UnpredictableT32(instr);
9832                            }
9833                          } else if ((imm >= -1048576) && (imm <= 1048574) &&
9834                                     ((imm & 1) == 0)) {
9835                            // B<c>{<q>} <label> ; T3
9836                            b(condition, Best, &location);
9837                            if (InITBlock()) {
9838                              UnpredictableT32(instr);
9839                            }
9840                          } else {
9841                            UnallocatedT32(instr);
9842                          }
9843                          break;
9844                        }
9845                      }
9846                      break;
9847                    }
9848                    case 0x00001000: {
9849                      // 0xf0009000
9850                      uint32_t encoded_imm =
9851                          (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
9852                          ((instr << 10) & 0x200000) |
9853                          ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
9854                      uint32_t S = encoded_imm & (1 << 23);
9855                      encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
9856                      int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
9857                      Location location(imm, kT32PcDelta);
9858                      if ((imm >= -16777216) && (imm <= 16777214) &&
9859                          ((imm & 1) == 0) &&
9860                          ((imm >= -2048) && (imm <= 2046) &&
9861                           ((imm & 1) == 0))) {
9862                        // B{<c>}.W <label> ; T4
9863                        b(CurrentCond(), Wide, &location);
9864                      } else if ((imm >= -16777216) && (imm <= 16777214) &&
9865                                 ((imm & 1) == 0)) {
9866                        // B{<c>}{<q>} <label> ; T4
9867                        b(CurrentCond(), Best, &location);
9868                        if (!OutsideITBlockOrLast()) {
9869                          UnpredictableT32(instr);
9870                        }
9871                      } else {
9872                        UnallocatedT32(instr);
9873                      }
9874                      break;
9875                    }
9876                    case 0x00004000: {
9877                      // 0xf000c000
9878                      if ((instr & 0x00000001) == 0x00000000) {
9879                        uint32_t encoded_imm = ((instr >> 1) & 0x3ff) |
9880                                               ((instr >> 6) & 0xffc00) |
9881                                               ((instr << 9) & 0x100000) |
9882                                               ((instr << 8) & 0x200000) |
9883                                               ((instr >> 4) & 0x400000);
9884                        uint32_t S = encoded_imm & (1 << 22);
9885                        encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20);
9886                        int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25);
9887                        Location location(imm, kT32PcDelta);
9888                        // BLX{<c>}{<q>} <label> ; T2
9889                        blx(CurrentCond(), &location);
9890                      } else {
9891                        UnallocatedT32(instr);
9892                      }
9893                      break;
9894                    }
9895                    case 0x00005000: {
9896                      // 0xf000d000
9897                      uint32_t encoded_imm =
9898                          (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
9899                          ((instr << 10) & 0x200000) |
9900                          ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
9901                      uint32_t S = encoded_imm & (1 << 23);
9902                      encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
9903                      int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
9904                      Location location(imm, kT32PcDelta);
9905                      // BL{<c>}{<q>} <label> ; T1
9906                      bl(CurrentCond(), &location);
9907                      break;
9908                    }
9909                  }
9910                  break;
9911                }
9912              }
9913              break;
9914            }
9915          }
9916          break;
9917        }
9918        case 0x08000000: {
9919          // 0xe8000000
9920          switch (instr & 0x06000000) {
9921            case 0x00000000: {
9922              // 0xe8000000
9923              switch (instr & 0x10100000) {
9924                case 0x00000000: {
9925                  // 0xe8000000
9926                  switch (instr & 0x01400000) {
9927                    case 0x00000000: {
9928                      // 0xe8000000
9929                      switch (instr & 0x00800000) {
9930                        case 0x00000000: {
9931                          // 0xe8000000
9932                          UnimplementedT32_32("SRSDB", instr);
9933                          break;
9934                        }
9935                        case 0x00800000: {
9936                          // 0xe8800000
9937                          unsigned rn = (instr >> 16) & 0xf;
9938                          WriteBack write_back((instr >> 21) & 0x1);
9939                          RegisterList registers(
9940                              (((instr >> 14) & 0x1) << kLRRegNum) |
9941                              (instr & 0x1fff));
9942                          if ((rn < kNumberOfT32LowRegisters) &&
9943                              write_back.DoesWriteBack() &&
9944                              ((registers.GetList() & ~0xff) == 0)) {
9945                            // STM{<c>}.W <Rn>{!}, <registers> ; T2
9946                            stm(CurrentCond(),
9947                                Wide,
9948                                Register(rn),
9949                                write_back,
9950                                registers);
9951                            if (((instr & 0xffd0a000) != 0xe8800000)) {
9952                              UnpredictableT32(instr);
9953                            }
9954                          } else {
9955                            // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2
9956                            stm(CurrentCond(),
9957                                Best,
9958                                Register(rn),
9959                                write_back,
9960                                registers);
9961                            if (((instr & 0xffd0a000) != 0xe8800000)) {
9962                              UnpredictableT32(instr);
9963                            }
9964                          }
9965                          break;
9966                        }
9967                      }
9968                      break;
9969                    }
9970                    case 0x00400000: {
9971                      // 0xe8400000
9972                      switch (instr & 0x00200000) {
9973                        case 0x00000000: {
9974                          // 0xe8400000
9975                          switch (instr & 0x00800000) {
9976                            case 0x00000000: {
9977                              // 0xe8400000
9978                              unsigned rd = (instr >> 8) & 0xf;
9979                              unsigned rt = (instr >> 12) & 0xf;
9980                              unsigned rn = (instr >> 16) & 0xf;
9981                              int32_t offset = (instr & 0xff) << 2;
9982                              // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length)
9983                              strex(CurrentCond(),
9984                                    Register(rd),
9985                                    Register(rt),
9986                                    MemOperand(Register(rn),
9987                                               plus,
9988                                               offset,
9989                                               Offset));
9990                              break;
9991                            }
9992                            case 0x00800000: {
9993                              // 0xe8c00000
9994                              switch (instr & 0x000000f0) {
9995                                case 0x00000040: {
9996                                  // 0xe8c00040
9997                                  unsigned rd = instr & 0xf;
9998                                  unsigned rt = (instr >> 12) & 0xf;
9999                                  unsigned rn = (instr >> 16) & 0xf;
10000                                  // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10001                                  strexb(CurrentCond(),
10002                                         Register(rd),
10003                                         Register(rt),
10004                                         MemOperand(Register(rn), Offset));
10005                                  if (((instr & 0xfff00ff0) != 0xe8c00f40)) {
10006                                    UnpredictableT32(instr);
10007                                  }
10008                                  break;
10009                                }
10010                                case 0x00000050: {
10011                                  // 0xe8c00050
10012                                  unsigned rd = instr & 0xf;
10013                                  unsigned rt = (instr >> 12) & 0xf;
10014                                  unsigned rn = (instr >> 16) & 0xf;
10015                                  // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10016                                  strexh(CurrentCond(),
10017                                         Register(rd),
10018                                         Register(rt),
10019                                         MemOperand(Register(rn), Offset));
10020                                  if (((instr & 0xfff00ff0) != 0xe8c00f50)) {
10021                                    UnpredictableT32(instr);
10022                                  }
10023                                  break;
10024                                }
10025                                case 0x00000070: {
10026                                  // 0xe8c00070
10027                                  unsigned rd = instr & 0xf;
10028                                  unsigned rt = (instr >> 12) & 0xf;
10029                                  unsigned rt2 = (instr >> 8) & 0xf;
10030                                  unsigned rn = (instr >> 16) & 0xf;
10031                                  // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
10032                                  strexd(CurrentCond(),
10033                                         Register(rd),
10034                                         Register(rt),
10035                                         Register(rt2),
10036                                         MemOperand(Register(rn), Offset));
10037                                  break;
10038                                }
10039                                case 0x00000080: {
10040                                  // 0xe8c00080
10041                                  unsigned rt = (instr >> 12) & 0xf;
10042                                  unsigned rn = (instr >> 16) & 0xf;
10043                                  // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10044                                  stlb(CurrentCond(),
10045                                       Register(rt),
10046                                       MemOperand(Register(rn), Offset));
10047                                  if (((instr & 0xfff00fff) != 0xe8c00f8f)) {
10048                                    UnpredictableT32(instr);
10049                                  }
10050                                  break;
10051                                }
10052                                case 0x00000090: {
10053                                  // 0xe8c00090
10054                                  unsigned rt = (instr >> 12) & 0xf;
10055                                  unsigned rn = (instr >> 16) & 0xf;
10056                                  // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10057                                  stlh(CurrentCond(),
10058                                       Register(rt),
10059                                       MemOperand(Register(rn), Offset));
10060                                  if (((instr & 0xfff00fff) != 0xe8c00f9f)) {
10061                                    UnpredictableT32(instr);
10062                                  }
10063                                  break;
10064                                }
10065                                case 0x000000a0: {
10066                                  // 0xe8c000a0
10067                                  unsigned rt = (instr >> 12) & 0xf;
10068                                  unsigned rn = (instr >> 16) & 0xf;
10069                                  // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1
10070                                  stl(CurrentCond(),
10071                                      Register(rt),
10072                                      MemOperand(Register(rn), Offset));
10073                                  if (((instr & 0xfff00fff) != 0xe8c00faf)) {
10074                                    UnpredictableT32(instr);
10075                                  }
10076                                  break;
10077                                }
10078                                case 0x000000c0: {
10079                                  // 0xe8c000c0
10080                                  unsigned rd = instr & 0xf;
10081                                  unsigned rt = (instr >> 12) & 0xf;
10082                                  unsigned rn = (instr >> 16) & 0xf;
10083                                  // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10084                                  stlexb(CurrentCond(),
10085                                         Register(rd),
10086                                         Register(rt),
10087                                         MemOperand(Register(rn), Offset));
10088                                  if (((instr & 0xfff00ff0) != 0xe8c00fc0)) {
10089                                    UnpredictableT32(instr);
10090                                  }
10091                                  break;
10092                                }
10093                                case 0x000000d0: {
10094                                  // 0xe8c000d0
10095                                  unsigned rd = instr & 0xf;
10096                                  unsigned rt = (instr >> 12) & 0xf;
10097                                  unsigned rn = (instr >> 16) & 0xf;
10098                                  // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10099                                  stlexh(CurrentCond(),
10100                                         Register(rd),
10101                                         Register(rt),
10102                                         MemOperand(Register(rn), Offset));
10103                                  if (((instr & 0xfff00ff0) != 0xe8c00fd0)) {
10104                                    UnpredictableT32(instr);
10105                                  }
10106                                  break;
10107                                }
10108                                case 0x000000e0: {
10109                                  // 0xe8c000e0
10110                                  unsigned rd = instr & 0xf;
10111                                  unsigned rt = (instr >> 12) & 0xf;
10112                                  unsigned rn = (instr >> 16) & 0xf;
10113                                  // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10114                                  stlex(CurrentCond(),
10115                                        Register(rd),
10116                                        Register(rt),
10117                                        MemOperand(Register(rn), Offset));
10118                                  if (((instr & 0xfff00ff0) != 0xe8c00fe0)) {
10119                                    UnpredictableT32(instr);
10120                                  }
10121                                  break;
10122                                }
10123                                case 0x000000f0: {
10124                                  // 0xe8c000f0
10125                                  unsigned rd = instr & 0xf;
10126                                  unsigned rt = (instr >> 12) & 0xf;
10127                                  unsigned rt2 = (instr >> 8) & 0xf;
10128                                  unsigned rn = (instr >> 16) & 0xf;
10129                                  // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
10130                                  stlexd(CurrentCond(),
10131                                         Register(rd),
10132                                         Register(rt),
10133                                         Register(rt2),
10134                                         MemOperand(Register(rn), Offset));
10135                                  break;
10136                                }
10137                                default:
10138                                  UnallocatedT32(instr);
10139                                  break;
10140                              }
10141                              break;
10142                            }
10143                          }
10144                          break;
10145                        }
10146                        case 0x00200000: {
10147                          // 0xe8600000
10148                          if (((instr & 0xf0000) == 0xf0000)) {
10149                            UnallocatedT32(instr);
10150                            return;
10151                          }
10152                          unsigned rt = (instr >> 12) & 0xf;
10153                          unsigned rt2 = (instr >> 8) & 0xf;
10154                          unsigned rn = (instr >> 16) & 0xf;
10155                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10156                                                                 : plus);
10157                          int32_t offset = (instr & 0xff) << 2;
10158                          // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
10159                          strd(CurrentCond(),
10160                               Register(rt),
10161                               Register(rt2),
10162                               MemOperand(Register(rn),
10163                                          sign,
10164                                          offset,
10165                                          PostIndex));
10166                          break;
10167                        }
10168                      }
10169                      break;
10170                    }
10171                    case 0x01000000: {
10172                      // 0xe9000000
10173                      switch (instr & 0x00800000) {
10174                        case 0x00000000: {
10175                          // 0xe9000000
10176                          if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
10177                               Uint32(0x1)) &&
10178                              ((Uint32((instr >> 16)) & Uint32(0xf)) ==
10179                               Uint32(0xd)) &&
10180                              (BitCount(((Uint32((instr >> 14)) & Uint32(0x1))
10181                                         << 13) |
10182                                        (Uint32(instr) & Uint32(0x1fff))) >
10183                               Int64(1))) {
10184                            RegisterList registers(
10185                                (((instr >> 14) & 0x1) << kLRRegNum) |
10186                                (instr & 0x1fff));
10187                            if (registers.IsR0toR7orLR()) {
10188                              // PUSH{<c>}.W <registers> ; T1
10189                              push(CurrentCond(), Wide, registers);
10190                              if (((instr & 0xffffa000) != 0xe92d0000)) {
10191                                UnpredictableT32(instr);
10192                              }
10193                            } else {
10194                              // PUSH{<c>}{<q>} <registers> ; T1
10195                              push(CurrentCond(), Best, registers);
10196                              if (((instr & 0xffffa000) != 0xe92d0000)) {
10197                                UnpredictableT32(instr);
10198                              }
10199                            }
10200                            return;
10201                          }
10202                          unsigned rn = (instr >> 16) & 0xf;
10203                          WriteBack write_back((instr >> 21) & 0x1);
10204                          RegisterList registers(
10205                              (((instr >> 14) & 0x1) << kLRRegNum) |
10206                              (instr & 0x1fff));
10207                          // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
10208                          stmdb(CurrentCond(),
10209                                Best,
10210                                Register(rn),
10211                                write_back,
10212                                registers);
10213                          if (((instr & 0xffd0a000) != 0xe9000000)) {
10214                            UnpredictableT32(instr);
10215                          }
10216                          break;
10217                        }
10218                        case 0x00800000: {
10219                          // 0xe9800000
10220                          UnimplementedT32_32("SRS{IA}", instr);
10221                          break;
10222                        }
10223                      }
10224                      break;
10225                    }
10226                    case 0x01400000: {
10227                      // 0xe9400000
10228                      switch (instr & 0x00200000) {
10229                        case 0x00000000: {
10230                          // 0xe9400000
10231                          if (((instr & 0xf0000) == 0xf0000)) {
10232                            UnallocatedT32(instr);
10233                            return;
10234                          }
10235                          unsigned rt = (instr >> 12) & 0xf;
10236                          unsigned rt2 = (instr >> 8) & 0xf;
10237                          unsigned rn = (instr >> 16) & 0xf;
10238                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10239                                                                 : plus);
10240                          int32_t offset = (instr & 0xff) << 2;
10241                          // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
10242                          strd(CurrentCond(),
10243                               Register(rt),
10244                               Register(rt2),
10245                               MemOperand(Register(rn), sign, offset, Offset));
10246                          break;
10247                        }
10248                        case 0x00200000: {
10249                          // 0xe9600000
10250                          if (((instr & 0xf0000) == 0xf0000)) {
10251                            UnallocatedT32(instr);
10252                            return;
10253                          }
10254                          unsigned rt = (instr >> 12) & 0xf;
10255                          unsigned rt2 = (instr >> 8) & 0xf;
10256                          unsigned rn = (instr >> 16) & 0xf;
10257                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10258                                                                 : plus);
10259                          int32_t offset = (instr & 0xff) << 2;
10260                          // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
10261                          strd(CurrentCond(),
10262                               Register(rt),
10263                               Register(rt2),
10264                               MemOperand(Register(rn),
10265                                          sign,
10266                                          offset,
10267                                          PreIndex));
10268                          break;
10269                        }
10270                      }
10271                      break;
10272                    }
10273                  }
10274                  break;
10275                }
10276                case 0x00100000: {
10277                  // 0xe8100000
10278                  switch (instr & 0x00400000) {
10279                    case 0x00000000: {
10280                      // 0xe8100000
10281                      switch (instr & 0x01800000) {
10282                        case 0x00000000: {
10283                          // 0xe8100000
10284                          UnimplementedT32_32("RFEDB", instr);
10285                          break;
10286                        }
10287                        case 0x00800000: {
10288                          // 0xe8900000
10289                          if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
10290                               Uint32(0x1)) &&
10291                              ((Uint32((instr >> 16)) & Uint32(0xf)) ==
10292                               Uint32(0xd)) &&
10293                              (BitCount(((Uint32((instr >> 15)) & Uint32(0x1))
10294                                         << 14) |
10295                                        ((Uint32((instr >> 14)) & Uint32(0x1))
10296                                         << 13) |
10297                                        (Uint32(instr) & Uint32(0x1fff))) >
10298                               Int64(1))) {
10299                            RegisterList registers(
10300                                (((instr >> 15) & 0x1) << kPCRegNum) |
10301                                (((instr >> 14) & 0x1) << kLRRegNum) |
10302                                (instr & 0x1fff));
10303                            if (registers.IsR0toR7orPC()) {
10304                              // POP{<c>}.W <registers> ; T2
10305                              pop(CurrentCond(), Wide, registers);
10306                              if (((instr & 0xffff2000) != 0xe8bd0000)) {
10307                                UnpredictableT32(instr);
10308                              }
10309                            } else {
10310                              // POP{<c>}{<q>} <registers> ; T2
10311                              pop(CurrentCond(), Best, registers);
10312                              if (((instr & 0xffff2000) != 0xe8bd0000)) {
10313                                UnpredictableT32(instr);
10314                              }
10315                            }
10316                            return;
10317                          }
10318                          unsigned rn = (instr >> 16) & 0xf;
10319                          WriteBack write_back((instr >> 21) & 0x1);
10320                          RegisterList registers(
10321                              (((instr >> 15) & 0x1) << kPCRegNum) |
10322                              (((instr >> 14) & 0x1) << kLRRegNum) |
10323                              (instr & 0x1fff));
10324                          if ((rn < kNumberOfT32LowRegisters) &&
10325                              (((registers.GetList() & (1 << rn)) == 0) ==
10326                               write_back.DoesWriteBack()) &&
10327                              ((registers.GetList() & ~0xff) == 0)) {
10328                            // LDM{<c>}.W <Rn>{!}, <registers> ; T2
10329                            ldm(CurrentCond(),
10330                                Wide,
10331                                Register(rn),
10332                                write_back,
10333                                registers);
10334                            if (((instr & 0xffd02000) != 0xe8900000)) {
10335                              UnpredictableT32(instr);
10336                            }
10337                          } else {
10338                            // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2
10339                            ldm(CurrentCond(),
10340                                Best,
10341                                Register(rn),
10342                                write_back,
10343                                registers);
10344                            if (((instr & 0xffd02000) != 0xe8900000)) {
10345                              UnpredictableT32(instr);
10346                            }
10347                          }
10348                          break;
10349                        }
10350                        case 0x01000000: {
10351                          // 0xe9100000
10352                          unsigned rn = (instr >> 16) & 0xf;
10353                          WriteBack write_back((instr >> 21) & 0x1);
10354                          RegisterList registers(
10355                              (((instr >> 15) & 0x1) << kPCRegNum) |
10356                              (((instr >> 14) & 0x1) << kLRRegNum) |
10357                              (instr & 0x1fff));
10358                          // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
10359                          ldmdb(CurrentCond(),
10360                                Register(rn),
10361                                write_back,
10362                                registers);
10363                          if (((instr & 0xffd02000) != 0xe9100000)) {
10364                            UnpredictableT32(instr);
10365                          }
10366                          break;
10367                        }
10368                        case 0x01800000: {
10369                          // 0xe9900000
10370                          UnimplementedT32_32("RFE{IA}", instr);
10371                          break;
10372                        }
10373                      }
10374                      break;
10375                    }
10376                    case 0x00400000: {
10377                      // 0xe8500000
10378                      switch (instr & 0x01200000) {
10379                        case 0x00000000: {
10380                          // 0xe8500000
10381                          switch (instr & 0x00800000) {
10382                            case 0x00000000: {
10383                              // 0xe8500000
10384                              unsigned rt = (instr >> 12) & 0xf;
10385                              unsigned rn = (instr >> 16) & 0xf;
10386                              int32_t offset = (instr & 0xff) << 2;
10387                              // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1
10388                              ldrex(CurrentCond(),
10389                                    Register(rt),
10390                                    MemOperand(Register(rn),
10391                                               plus,
10392                                               offset,
10393                                               Offset));
10394                              if (((instr & 0xfff00f00) != 0xe8500f00)) {
10395                                UnpredictableT32(instr);
10396                              }
10397                              break;
10398                            }
10399                            case 0x00800000: {
10400                              // 0xe8d00000
10401                              switch (instr & 0x000000f0) {
10402                                case 0x00000000: {
10403                                  // 0xe8d00000
10404                                  unsigned rn = (instr >> 16) & 0xf;
10405                                  unsigned rm = instr & 0xf;
10406                                  // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1
10407                                  tbb(CurrentCond(),
10408                                      Register(rn),
10409                                      Register(rm));
10410                                  if (((instr & 0xfff0fff0) != 0xe8d0f000) ||
10411                                      !OutsideITBlockOrLast()) {
10412                                    UnpredictableT32(instr);
10413                                  }
10414                                  break;
10415                                }
10416                                case 0x00000010: {
10417                                  // 0xe8d00010
10418                                  unsigned rn = (instr >> 16) & 0xf;
10419                                  unsigned rm = instr & 0xf;
10420                                  // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1
10421                                  tbh(CurrentCond(),
10422                                      Register(rn),
10423                                      Register(rm));
10424                                  if (((instr & 0xfff0fff0) != 0xe8d0f010) ||
10425                                      !OutsideITBlockOrLast()) {
10426                                    UnpredictableT32(instr);
10427                                  }
10428                                  break;
10429                                }
10430                                case 0x00000040: {
10431                                  // 0xe8d00040
10432                                  unsigned rt = (instr >> 12) & 0xf;
10433                                  unsigned rn = (instr >> 16) & 0xf;
10434                                  // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10435                                  ldrexb(CurrentCond(),
10436                                         Register(rt),
10437                                         MemOperand(Register(rn), Offset));
10438                                  if (((instr & 0xfff00fff) != 0xe8d00f4f)) {
10439                                    UnpredictableT32(instr);
10440                                  }
10441                                  break;
10442                                }
10443                                case 0x00000050: {
10444                                  // 0xe8d00050
10445                                  unsigned rt = (instr >> 12) & 0xf;
10446                                  unsigned rn = (instr >> 16) & 0xf;
10447                                  // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10448                                  ldrexh(CurrentCond(),
10449                                         Register(rt),
10450                                         MemOperand(Register(rn), Offset));
10451                                  if (((instr & 0xfff00fff) != 0xe8d00f5f)) {
10452                                    UnpredictableT32(instr);
10453                                  }
10454                                  break;
10455                                }
10456                                case 0x00000070: {
10457                                  // 0xe8d00070
10458                                  unsigned rt = (instr >> 12) & 0xf;
10459                                  unsigned rt2 = (instr >> 8) & 0xf;
10460                                  unsigned rn = (instr >> 16) & 0xf;
10461                                  // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
10462                                  ldrexd(CurrentCond(),
10463                                         Register(rt),
10464                                         Register(rt2),
10465                                         MemOperand(Register(rn), Offset));
10466                                  if (((instr & 0xfff000ff) != 0xe8d0007f)) {
10467                                    UnpredictableT32(instr);
10468                                  }
10469                                  break;
10470                                }
10471                                case 0x00000080: {
10472                                  // 0xe8d00080
10473                                  unsigned rt = (instr >> 12) & 0xf;
10474                                  unsigned rn = (instr >> 16) & 0xf;
10475                                  // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10476                                  ldab(CurrentCond(),
10477                                       Register(rt),
10478                                       MemOperand(Register(rn), Offset));
10479                                  if (((instr & 0xfff00fff) != 0xe8d00f8f)) {
10480                                    UnpredictableT32(instr);
10481                                  }
10482                                  break;
10483                                }
10484                                case 0x00000090: {
10485                                  // 0xe8d00090
10486                                  unsigned rt = (instr >> 12) & 0xf;
10487                                  unsigned rn = (instr >> 16) & 0xf;
10488                                  // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10489                                  ldah(CurrentCond(),
10490                                       Register(rt),
10491                                       MemOperand(Register(rn), Offset));
10492                                  if (((instr & 0xfff00fff) != 0xe8d00f9f)) {
10493                                    UnpredictableT32(instr);
10494                                  }
10495                                  break;
10496                                }
10497                                case 0x000000a0: {
10498                                  // 0xe8d000a0
10499                                  unsigned rt = (instr >> 12) & 0xf;
10500                                  unsigned rn = (instr >> 16) & 0xf;
10501                                  // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1
10502                                  lda(CurrentCond(),
10503                                      Register(rt),
10504                                      MemOperand(Register(rn), Offset));
10505                                  if (((instr & 0xfff00fff) != 0xe8d00faf)) {
10506                                    UnpredictableT32(instr);
10507                                  }
10508                                  break;
10509                                }
10510                                case 0x000000c0: {
10511                                  // 0xe8d000c0
10512                                  unsigned rt = (instr >> 12) & 0xf;
10513                                  unsigned rn = (instr >> 16) & 0xf;
10514                                  // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10515                                  ldaexb(CurrentCond(),
10516                                         Register(rt),
10517                                         MemOperand(Register(rn), Offset));
10518                                  if (((instr & 0xfff00fff) != 0xe8d00fcf)) {
10519                                    UnpredictableT32(instr);
10520                                  }
10521                                  break;
10522                                }
10523                                case 0x000000d0: {
10524                                  // 0xe8d000d0
10525                                  unsigned rt = (instr >> 12) & 0xf;
10526                                  unsigned rn = (instr >> 16) & 0xf;
10527                                  // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10528                                  ldaexh(CurrentCond(),
10529                                         Register(rt),
10530                                         MemOperand(Register(rn), Offset));
10531                                  if (((instr & 0xfff00fff) != 0xe8d00fdf)) {
10532                                    UnpredictableT32(instr);
10533                                  }
10534                                  break;
10535                                }
10536                                case 0x000000e0: {
10537                                  // 0xe8d000e0
10538                                  unsigned rt = (instr >> 12) & 0xf;
10539                                  unsigned rn = (instr >> 16) & 0xf;
10540                                  // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1
10541                                  ldaex(CurrentCond(),
10542                                        Register(rt),
10543                                        MemOperand(Register(rn), Offset));
10544                                  if (((instr & 0xfff00fff) != 0xe8d00fef)) {
10545                                    UnpredictableT32(instr);
10546                                  }
10547                                  break;
10548                                }
10549                                case 0x000000f0: {
10550                                  // 0xe8d000f0
10551                                  unsigned rt = (instr >> 12) & 0xf;
10552                                  unsigned rt2 = (instr >> 8) & 0xf;
10553                                  unsigned rn = (instr >> 16) & 0xf;
10554                                  // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
10555                                  ldaexd(CurrentCond(),
10556                                         Register(rt),
10557                                         Register(rt2),
10558                                         MemOperand(Register(rn), Offset));
10559                                  if (((instr & 0xfff000ff) != 0xe8d000ff)) {
10560                                    UnpredictableT32(instr);
10561                                  }
10562                                  break;
10563                                }
10564                                default:
10565                                  UnallocatedT32(instr);
10566                                  break;
10567                              }
10568                              break;
10569                            }
10570                          }
10571                          break;
10572                        }
10573                        case 0x00200000: {
10574                          // 0xe8700000
10575                          switch (instr & 0x000f0000) {
10576                            case 0x000f0000: {
10577                              // 0xe87f0000
10578                              if (((instr & 0x1200000) == 0x0)) {
10579                                UnallocatedT32(instr);
10580                                return;
10581                              }
10582                              unsigned rt = (instr >> 12) & 0xf;
10583                              unsigned rt2 = (instr >> 8) & 0xf;
10584                              uint32_t U = (instr >> 23) & 0x1;
10585                              int32_t imm = instr & 0xff;
10586                              imm <<= 2;
10587                              if (U == 0) imm = -imm;
10588                              bool minus_zero = (imm == 0) && (U == 0);
10589                              Location location(imm, kT32PcDelta);
10590                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10591                              if (minus_zero) {
10592                                ldrd(CurrentCond(),
10593                                     Register(rt),
10594                                     Register(rt2),
10595                                     MemOperand(pc, minus, 0));
10596                              } else {
10597                                ldrd(CurrentCond(),
10598                                     Register(rt),
10599                                     Register(rt2),
10600                                     &location);
10601                              }
10602                              if (((instr & 0xff7f0000) != 0xe95f0000)) {
10603                                UnpredictableT32(instr);
10604                              }
10605                              break;
10606                            }
10607                            default: {
10608                              if (((instr & 0xf0000) == 0xf0000)) {
10609                                UnallocatedT32(instr);
10610                                return;
10611                              }
10612                              unsigned rt = (instr >> 12) & 0xf;
10613                              unsigned rt2 = (instr >> 8) & 0xf;
10614                              unsigned rn = (instr >> 16) & 0xf;
10615                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10616                                                                     : plus);
10617                              int32_t offset = (instr & 0xff) << 2;
10618                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
10619                              ldrd(CurrentCond(),
10620                                   Register(rt),
10621                                   Register(rt2),
10622                                   MemOperand(Register(rn),
10623                                              sign,
10624                                              offset,
10625                                              PostIndex));
10626                              break;
10627                            }
10628                          }
10629                          break;
10630                        }
10631                        case 0x01000000: {
10632                          // 0xe9500000
10633                          switch (instr & 0x000f0000) {
10634                            case 0x000f0000: {
10635                              // 0xe95f0000
10636                              if (((instr & 0x1200000) == 0x0)) {
10637                                UnallocatedT32(instr);
10638                                return;
10639                              }
10640                              unsigned rt = (instr >> 12) & 0xf;
10641                              unsigned rt2 = (instr >> 8) & 0xf;
10642                              uint32_t U = (instr >> 23) & 0x1;
10643                              int32_t imm = instr & 0xff;
10644                              imm <<= 2;
10645                              if (U == 0) imm = -imm;
10646                              bool minus_zero = (imm == 0) && (U == 0);
10647                              Location location(imm, kT32PcDelta);
10648                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10649                              if (minus_zero) {
10650                                ldrd(CurrentCond(),
10651                                     Register(rt),
10652                                     Register(rt2),
10653                                     MemOperand(pc, minus, 0));
10654                              } else {
10655                                ldrd(CurrentCond(),
10656                                     Register(rt),
10657                                     Register(rt2),
10658                                     &location);
10659                              }
10660                              if (((instr & 0xff7f0000) != 0xe95f0000)) {
10661                                UnpredictableT32(instr);
10662                              }
10663                              break;
10664                            }
10665                            default: {
10666                              if (((instr & 0xf0000) == 0xf0000)) {
10667                                UnallocatedT32(instr);
10668                                return;
10669                              }
10670                              unsigned rt = (instr >> 12) & 0xf;
10671                              unsigned rt2 = (instr >> 8) & 0xf;
10672                              unsigned rn = (instr >> 16) & 0xf;
10673                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10674                                                                     : plus);
10675                              int32_t offset = (instr & 0xff) << 2;
10676                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
10677                              ldrd(CurrentCond(),
10678                                   Register(rt),
10679                                   Register(rt2),
10680                                   MemOperand(Register(rn),
10681                                              sign,
10682                                              offset,
10683                                              Offset));
10684                              break;
10685                            }
10686                          }
10687                          break;
10688                        }
10689                        case 0x01200000: {
10690                          // 0xe9700000
10691                          switch (instr & 0x000f0000) {
10692                            case 0x000f0000: {
10693                              // 0xe97f0000
10694                              if (((instr & 0x1200000) == 0x0)) {
10695                                UnallocatedT32(instr);
10696                                return;
10697                              }
10698                              unsigned rt = (instr >> 12) & 0xf;
10699                              unsigned rt2 = (instr >> 8) & 0xf;
10700                              uint32_t U = (instr >> 23) & 0x1;
10701                              int32_t imm = instr & 0xff;
10702                              imm <<= 2;
10703                              if (U == 0) imm = -imm;
10704                              bool minus_zero = (imm == 0) && (U == 0);
10705                              Location location(imm, kT32PcDelta);
10706                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10707                              if (minus_zero) {
10708                                ldrd(CurrentCond(),
10709                                     Register(rt),
10710                                     Register(rt2),
10711                                     MemOperand(pc, minus, 0));
10712                              } else {
10713                                ldrd(CurrentCond(),
10714                                     Register(rt),
10715                                     Register(rt2),
10716                                     &location);
10717                              }
10718                              if (((instr & 0xff7f0000) != 0xe95f0000)) {
10719                                UnpredictableT32(instr);
10720                              }
10721                              break;
10722                            }
10723                            default: {
10724                              if (((instr & 0xf0000) == 0xf0000)) {
10725                                UnallocatedT32(instr);
10726                                return;
10727                              }
10728                              unsigned rt = (instr >> 12) & 0xf;
10729                              unsigned rt2 = (instr >> 8) & 0xf;
10730                              unsigned rn = (instr >> 16) & 0xf;
10731                              Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10732                                                                     : plus);
10733                              int32_t offset = (instr & 0xff) << 2;
10734                              // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
10735                              ldrd(CurrentCond(),
10736                                   Register(rt),
10737                                   Register(rt2),
10738                                   MemOperand(Register(rn),
10739                                              sign,
10740                                              offset,
10741                                              PreIndex));
10742                              break;
10743                            }
10744                          }
10745                          break;
10746                        }
10747                      }
10748                      break;
10749                    }
10750                  }
10751                  break;
10752                }
10753                case 0x10000000: {
10754                  // 0xf8000000
10755                  switch (instr & 0x01a00000) {
10756                    case 0x00000000: {
10757                      // 0xf8000000
10758                      switch (instr & 0x00400d00) {
10759                        case 0x00000000: {
10760                          // 0xf8000000
10761                          if ((instr & 0x000002c0) == 0x00000000) {
10762                            if (((instr & 0xf0000) == 0xf0000)) {
10763                              UnallocatedT32(instr);
10764                              return;
10765                            }
10766                            unsigned rt = (instr >> 12) & 0xf;
10767                            unsigned rn = (instr >> 16) & 0xf;
10768                            Sign sign(plus);
10769                            unsigned rm = instr & 0xf;
10770                            Shift shift = LSL;
10771                            uint32_t amount = (instr >> 4) & 0x3;
10772                            AddrMode addrmode = Offset;
10773                            if ((rt < kNumberOfT32LowRegisters) &&
10774                                (rn < kNumberOfT32LowRegisters) &&
10775                                (rm < kNumberOfT32LowRegisters) &&
10776                                shift.IsLSL() && (amount == 0) &&
10777                                sign.IsPlus()) {
10778                              // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
10779                              strb(CurrentCond(),
10780                                   Wide,
10781                                   Register(rt),
10782                                   MemOperand(Register(rn),
10783                                              sign,
10784                                              Register(rm),
10785                                              addrmode));
10786                            } else {
10787                              // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
10788                              strb(CurrentCond(),
10789                                   Best,
10790                                   Register(rt),
10791                                   MemOperand(Register(rn),
10792                                              sign,
10793                                              Register(rm),
10794                                              shift,
10795                                              amount,
10796                                              addrmode));
10797                            }
10798                          } else {
10799                            UnallocatedT32(instr);
10800                          }
10801                          break;
10802                        }
10803                        case 0x00000900: {
10804                          // 0xf8000900
10805                          if (((instr & 0xf0000) == 0xf0000)) {
10806                            UnallocatedT32(instr);
10807                            return;
10808                          }
10809                          unsigned rt = (instr >> 12) & 0xf;
10810                          unsigned rn = (instr >> 16) & 0xf;
10811                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10812                          int32_t offset = instr & 0xff;
10813                          // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
10814                          strb(CurrentCond(),
10815                               Best,
10816                               Register(rt),
10817                               MemOperand(Register(rn),
10818                                          sign,
10819                                          offset,
10820                                          PostIndex));
10821                          break;
10822                        }
10823                        case 0x00000c00: {
10824                          // 0xf8000c00
10825                          switch (instr & 0x00000200) {
10826                            case 0x00000000: {
10827                              // 0xf8000c00
10828                              if (((instr & 0xf0000) == 0xf0000)) {
10829                                UnallocatedT32(instr);
10830                                return;
10831                              }
10832                              unsigned rt = (instr >> 12) & 0xf;
10833                              unsigned rn = (instr >> 16) & 0xf;
10834                              int32_t offset = instr & 0xff;
10835                              // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
10836                              strb(CurrentCond(),
10837                                   Best,
10838                                   Register(rt),
10839                                   MemOperand(Register(rn),
10840                                              minus,
10841                                              offset,
10842                                              Offset));
10843                              break;
10844                            }
10845                            case 0x00000200: {
10846                              // 0xf8000e00
10847                              if (((instr & 0xf0000) == 0xf0000)) {
10848                                UnallocatedT32(instr);
10849                                return;
10850                              }
10851                              UnimplementedT32_32("STRBT", instr);
10852                              break;
10853                            }
10854                          }
10855                          break;
10856                        }
10857                        case 0x00000d00: {
10858                          // 0xf8000d00
10859                          if (((instr & 0xf0000) == 0xf0000)) {
10860                            UnallocatedT32(instr);
10861                            return;
10862                          }
10863                          unsigned rt = (instr >> 12) & 0xf;
10864                          unsigned rn = (instr >> 16) & 0xf;
10865                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10866                          int32_t offset = instr & 0xff;
10867                          // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
10868                          strb(CurrentCond(),
10869                               Best,
10870                               Register(rt),
10871                               MemOperand(Register(rn),
10872                                          sign,
10873                                          offset,
10874                                          PreIndex));
10875                          break;
10876                        }
10877                        case 0x00400000: {
10878                          // 0xf8400000
10879                          if ((instr & 0x000002c0) == 0x00000000) {
10880                            if (((instr & 0xf0000) == 0xf0000)) {
10881                              UnallocatedT32(instr);
10882                              return;
10883                            }
10884                            unsigned rt = (instr >> 12) & 0xf;
10885                            unsigned rn = (instr >> 16) & 0xf;
10886                            Sign sign(plus);
10887                            unsigned rm = instr & 0xf;
10888                            Shift shift = LSL;
10889                            uint32_t amount = (instr >> 4) & 0x3;
10890                            AddrMode addrmode = Offset;
10891                            if ((rt < kNumberOfT32LowRegisters) &&
10892                                (rn < kNumberOfT32LowRegisters) &&
10893                                (rm < kNumberOfT32LowRegisters) &&
10894                                shift.IsLSL() && (amount == 0) &&
10895                                sign.IsPlus()) {
10896                              // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
10897                              str(CurrentCond(),
10898                                  Wide,
10899                                  Register(rt),
10900                                  MemOperand(Register(rn),
10901                                             sign,
10902                                             Register(rm),
10903                                             addrmode));
10904                            } else {
10905                              // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
10906                              str(CurrentCond(),
10907                                  Best,
10908                                  Register(rt),
10909                                  MemOperand(Register(rn),
10910                                             sign,
10911                                             Register(rm),
10912                                             shift,
10913                                             amount,
10914                                             addrmode));
10915                            }
10916                          } else {
10917                            UnallocatedT32(instr);
10918                          }
10919                          break;
10920                        }
10921                        case 0x00400900: {
10922                          // 0xf8400900
10923                          if (((instr & 0xf0000) == 0xf0000)) {
10924                            UnallocatedT32(instr);
10925                            return;
10926                          }
10927                          unsigned rt = (instr >> 12) & 0xf;
10928                          unsigned rn = (instr >> 16) & 0xf;
10929                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10930                          int32_t offset = instr & 0xff;
10931                          // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4
10932                          str(CurrentCond(),
10933                              Best,
10934                              Register(rt),
10935                              MemOperand(Register(rn),
10936                                         sign,
10937                                         offset,
10938                                         PostIndex));
10939                          break;
10940                        }
10941                        case 0x00400c00: {
10942                          // 0xf8400c00
10943                          switch (instr & 0x00000200) {
10944                            case 0x00000000: {
10945                              // 0xf8400c00
10946                              if (((instr & 0xf0000) == 0xf0000)) {
10947                                UnallocatedT32(instr);
10948                                return;
10949                              }
10950                              unsigned rt = (instr >> 12) & 0xf;
10951                              unsigned rn = (instr >> 16) & 0xf;
10952                              int32_t offset = instr & 0xff;
10953                              // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4
10954                              str(CurrentCond(),
10955                                  Best,
10956                                  Register(rt),
10957                                  MemOperand(Register(rn),
10958                                             minus,
10959                                             offset,
10960                                             Offset));
10961                              break;
10962                            }
10963                            case 0x00000200: {
10964                              // 0xf8400e00
10965                              if (((instr & 0xf0000) == 0xf0000)) {
10966                                UnallocatedT32(instr);
10967                                return;
10968                              }
10969                              UnimplementedT32_32("STRT", instr);
10970                              break;
10971                            }
10972                          }
10973                          break;
10974                        }
10975                        case 0x00400d00: {
10976                          // 0xf8400d00
10977                          if (((instr & 0xf0000) == 0xf0000)) {
10978                            UnallocatedT32(instr);
10979                            return;
10980                          }
10981                          if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
10982                               Uint32(0xd)) &&
10983                              ((Uint32((instr >> 9)) & Uint32(0x1)) ==
10984                               Uint32(0x0)) &&
10985                              ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) {
10986                            unsigned rt = (instr >> 12) & 0xf;
10987                            if ((rt <= 7) || (rt == kLRRegNum)) {
10988                              // PUSH{<c>}.W <single_register_list> ; T4
10989                              push(CurrentCond(), Wide, Register(rt));
10990                            } else {
10991                              // PUSH{<c>}{<q>} <single_register_list> ; T4
10992                              push(CurrentCond(), Best, Register(rt));
10993                            }
10994                            return;
10995                          }
10996                          unsigned rt = (instr >> 12) & 0xf;
10997                          unsigned rn = (instr >> 16) & 0xf;
10998                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10999                          int32_t offset = instr & 0xff;
11000                          // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4
11001                          str(CurrentCond(),
11002                              Best,
11003                              Register(rt),
11004                              MemOperand(Register(rn), sign, offset, PreIndex));
11005                          break;
11006                        }
11007                        default:
11008                          UnallocatedT32(instr);
11009                          break;
11010                      }
11011                      break;
11012                    }
11013                    case 0x00200000: {
11014                      // 0xf8200000
11015                      switch (instr & 0x00400d00) {
11016                        case 0x00000000: {
11017                          // 0xf8200000
11018                          if ((instr & 0x000002c0) == 0x00000000) {
11019                            if (((instr & 0xf0000) == 0xf0000)) {
11020                              UnallocatedT32(instr);
11021                              return;
11022                            }
11023                            unsigned rt = (instr >> 12) & 0xf;
11024                            unsigned rn = (instr >> 16) & 0xf;
11025                            Sign sign(plus);
11026                            unsigned rm = instr & 0xf;
11027                            Shift shift = LSL;
11028                            uint32_t amount = (instr >> 4) & 0x3;
11029                            AddrMode addrmode = Offset;
11030                            if ((rt < kNumberOfT32LowRegisters) &&
11031                                (rn < kNumberOfT32LowRegisters) &&
11032                                (rm < kNumberOfT32LowRegisters) &&
11033                                shift.IsLSL() && (amount == 0) &&
11034                                sign.IsPlus()) {
11035                              // STRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
11036                              strh(CurrentCond(),
11037                                   Wide,
11038                                   Register(rt),
11039                                   MemOperand(Register(rn),
11040                                              sign,
11041                                              Register(rm),
11042                                              addrmode));
11043                            } else {
11044                              // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
11045                              strh(CurrentCond(),
11046                                   Best,
11047                                   Register(rt),
11048                                   MemOperand(Register(rn),
11049                                              sign,
11050                                              Register(rm),
11051                                              shift,
11052                                              amount,
11053                                              addrmode));
11054                            }
11055                          } else {
11056                            UnallocatedT32(instr);
11057                          }
11058                          break;
11059                        }
11060                        case 0x00000900: {
11061                          // 0xf8200900
11062                          if (((instr & 0xf0000) == 0xf0000)) {
11063                            UnallocatedT32(instr);
11064                            return;
11065                          }
11066                          unsigned rt = (instr >> 12) & 0xf;
11067                          unsigned rn = (instr >> 16) & 0xf;
11068                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
11069                          int32_t offset = instr & 0xff;
11070                          // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
11071                          strh(CurrentCond(),
11072                               Best,
11073                               Register(rt),
11074                               MemOperand(Register(rn),
11075                                          sign,
11076                                          offset,
11077                                          PostIndex));
11078                          break;
11079                        }
11080                        case 0x00000c00: {
11081                          // 0xf8200c00
11082                          switch (instr & 0x00000200) {
11083                            case 0x00000000: {
11084                              // 0xf8200c00
11085                              if (((instr & 0xf0000) == 0xf0000)) {
11086                                UnallocatedT32(instr);
11087                                return;
11088                              }
11089                              unsigned rt = (instr >> 12) & 0xf;
11090                              unsigned rn = (instr >> 16) & 0xf;
11091                              int32_t offset = instr & 0xff;
11092                              // STRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
11093                              strh(CurrentCond(),
11094                                   Best,
11095                                   Register(rt),
11096                                   MemOperand(Register(rn),
11097                                              minus,
11098                                              offset,
11099                                              Offset));
11100                              break;
11101                            }
11102                            case 0x00000200: {
11103                              // 0xf8200e00
11104                              if (((instr & 0xf0000) == 0xf0000)) {
11105                                UnallocatedT32(instr);
11106                                return;
11107                              }
11108                              UnimplementedT32_32("STRHT", instr);
11109                              break;
11110                            }
11111                          }
11112                          break;
11113                        }
11114                        case 0x00000d00: {
11115                          // 0xf8200d00
11116                          if (((instr & 0xf0000) == 0xf0000)) {
11117                            UnallocatedT32(instr);
11118                            return;
11119                          }
11120                          unsigned rt = (instr >> 12) & 0xf;
11121                          unsigned rn = (instr >> 16) & 0xf;
11122                          Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
11123                          int32_t offset = instr & 0xff;
11124                          // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
11125                          strh(CurrentCond(),
11126                               Best,
11127                               Register(rt),
11128                               MemOperand(Register(rn),
11129                                          sign,
11130                                          offset,
11131                                          PreIndex));
11132                          break;
11133                        }
11134                        default:
11135                          UnallocatedT32(instr);
11136                          break;
11137                      }
11138                      break;
11139                    }
11140                    case 0x00800000: {
11141                      // 0xf8800000
11142                      switch (instr & 0x00400000) {
11143                        case 0x00000000: {
11144                          // 0xf8800000
11145                          if (((instr & 0xf0000) == 0xf0000)) {
11146                            UnallocatedT32(instr);
11147                            return;
11148                          }
11149                          unsigned rt = (instr >> 12) & 0xf;
11150                          unsigned rn = (instr >> 16) & 0xf;
11151                          int32_t offset = instr & 0xfff;
11152                          if ((rt < kNumberOfT32LowRegisters) &&
11153                              (rn < kNumberOfT32LowRegisters) &&
11154                              ((offset >= 0) && (offset <= 31))) {
11155                            // STRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11156                            strb(CurrentCond(),
11157                                 Wide,
11158                                 Register(rt),
11159                                 MemOperand(Register(rn),
11160                                            plus,
11161                                            offset,
11162                                            Offset));
11163                          } else {
11164                            // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11165                            strb(CurrentCond(),
11166                                 Best,
11167                                 Register(rt),
11168                                 MemOperand(Register(rn),
11169                                            plus,
11170                                            offset,
11171                                            Offset));
11172                          }
11173                          break;
11174                        }
11175                        case 0x00400000: {
11176                          // 0xf8c00000
11177                          if (((instr & 0xf0000) == 0xf0000)) {
11178                            UnallocatedT32(instr);
11179                            return;
11180                          }
11181                          unsigned rt = (instr >> 12) & 0xf;
11182                          unsigned rn = (instr >> 16) & 0xf;
11183                          int32_t offset = instr & 0xfff;
11184                          if (((rt < kNumberOfT32LowRegisters) &&
11185                               (rn < kNumberOfT32LowRegisters) &&
11186                               ((offset >= 0) && (offset <= 124) &&
11187                                ((offset & 3) == 0))) ||
11188                              ((rt < kNumberOfT32LowRegisters) &&
11189                               (rn == sp.GetCode()) &&
11190                               ((offset >= 0) && (offset <= 1020) &&
11191                                ((offset & 3) == 0)))) {
11192                            // STR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
11193                            str(CurrentCond(),
11194                                Wide,
11195                                Register(rt),
11196                                MemOperand(Register(rn), plus, offset, Offset));
11197                          } else {
11198                            // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
11199                            str(CurrentCond(),
11200                                Best,
11201                                Register(rt),
11202                                MemOperand(Register(rn), plus, offset, Offset));
11203                          }
11204                          break;
11205                        }
11206                      }
11207                      break;
11208                    }
11209                    case 0x00a00000: {
11210                      // 0xf8a00000
11211                      if ((instr & 0x00400000) == 0x00000000) {
11212                        if (((instr & 0xf0000) == 0xf0000)) {
11213                          UnallocatedT32(instr);
11214                          return;
11215                        }
11216                        unsigned rt = (instr >> 12) & 0xf;
11217                        unsigned rn = (instr >> 16) & 0xf;
11218                        int32_t offset = instr & 0xfff;
11219                        if ((rt < kNumberOfT32LowRegisters) &&
11220                            (rn < kNumberOfT32LowRegisters) &&
11221                            ((offset >= 0) && (offset <= 62) &&
11222                             ((offset & 1) == 0))) {
11223                          // STRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11224                          strh(CurrentCond(),
11225                               Wide,
11226                               Register(rt),
11227                               MemOperand(Register(rn), plus, offset, Offset));
11228                        } else {
11229                          // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11230                          strh(CurrentCond(),
11231                               Best,
11232                               Register(rt),
11233                               MemOperand(Register(rn), plus, offset, Offset));
11234                        }
11235                      } else {
11236                        UnallocatedT32(instr);
11237                      }
11238                      break;
11239                    }
11240                    case 0x01000000: {
11241                      // 0xf9000000
11242                      switch (instr & 0x0000000d) {
11243                        case 0x0000000d: {
11244                          // 0xf900000d
11245                          switch (instr & 0x00000002) {
11246                            case 0x00000000: {
11247                              // 0xf900000d
11248                              switch (instr & 0x00000f00) {
11249                                case 0x00000000: {
11250                                  // 0xf900000d
11251                                  DataType dt =
11252                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11253                                  if (dt.Is(kDataTypeValueInvalid)) {
11254                                    UnallocatedT32(instr);
11255                                    return;
11256                                  }
11257                                  Alignment align =
11258                                      Align_align_4_Decode((instr >> 4) & 0x3);
11259                                  if (dt.Is(kDataTypeValueInvalid) ||
11260                                      align.Is(kBadAlignment)) {
11261                                    UnallocatedT32(instr);
11262                                    return;
11263                                  }
11264                                  unsigned first =
11265                                      ExtractDRegister(instr, 22, 12);
11266                                  unsigned length;
11267                                  SpacingType spacing;
11268                                  switch ((instr >> 8) & 0xf) {
11269                                    default:
11270                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11271                                    case 0x0:
11272                                      length = 4;
11273                                      spacing = kSingle;
11274                                      break;
11275                                    case 0x1:
11276                                      length = 4;
11277                                      spacing = kDouble;
11278                                      break;
11279                                  }
11280                                  unsigned last =
11281                                      first +
11282                                      (length - 1) *
11283                                          (spacing == kSingle ? 1 : 2);
11284                                  TransferType transfer = kMultipleLanes;
11285                                  unsigned rn = (instr >> 16) & 0xf;
11286                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11287                                  vst4(CurrentCond(),
11288                                       dt,
11289                                       NeonRegisterList(DRegister(first),
11290                                                        DRegister(last),
11291                                                        spacing,
11292                                                        transfer),
11293                                       AlignedMemOperand(Register(rn),
11294                                                         align,
11295                                                         PostIndex));
11296                                  break;
11297                                }
11298                                case 0x00000100: {
11299                                  // 0xf900010d
11300                                  DataType dt =
11301                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11302                                  if (dt.Is(kDataTypeValueInvalid)) {
11303                                    UnallocatedT32(instr);
11304                                    return;
11305                                  }
11306                                  Alignment align =
11307                                      Align_align_4_Decode((instr >> 4) & 0x3);
11308                                  if (dt.Is(kDataTypeValueInvalid) ||
11309                                      align.Is(kBadAlignment)) {
11310                                    UnallocatedT32(instr);
11311                                    return;
11312                                  }
11313                                  unsigned first =
11314                                      ExtractDRegister(instr, 22, 12);
11315                                  unsigned length;
11316                                  SpacingType spacing;
11317                                  switch ((instr >> 8) & 0xf) {
11318                                    default:
11319                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11320                                    case 0x0:
11321                                      length = 4;
11322                                      spacing = kSingle;
11323                                      break;
11324                                    case 0x1:
11325                                      length = 4;
11326                                      spacing = kDouble;
11327                                      break;
11328                                  }
11329                                  unsigned last =
11330                                      first +
11331                                      (length - 1) *
11332                                          (spacing == kSingle ? 1 : 2);
11333                                  TransferType transfer = kMultipleLanes;
11334                                  unsigned rn = (instr >> 16) & 0xf;
11335                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11336                                  vst4(CurrentCond(),
11337                                       dt,
11338                                       NeonRegisterList(DRegister(first),
11339                                                        DRegister(last),
11340                                                        spacing,
11341                                                        transfer),
11342                                       AlignedMemOperand(Register(rn),
11343                                                         align,
11344                                                         PostIndex));
11345                                  break;
11346                                }
11347                                case 0x00000200: {
11348                                  // 0xf900020d
11349                                  if (((instr & 0xe20) == 0x620) ||
11350                                      ((instr & 0xf30) == 0xa30)) {
11351                                    UnallocatedT32(instr);
11352                                    return;
11353                                  }
11354                                  DataType dt =
11355                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11356                                  if (dt.Is(kDataTypeValueInvalid)) {
11357                                    UnallocatedT32(instr);
11358                                    return;
11359                                  }
11360                                  Alignment align =
11361                                      Align_align_5_Decode((instr >> 4) & 0x3);
11362                                  if (dt.Is(kDataTypeValueInvalid) ||
11363                                      align.Is(kBadAlignment)) {
11364                                    UnallocatedT32(instr);
11365                                    return;
11366                                  }
11367                                  unsigned first =
11368                                      ExtractDRegister(instr, 22, 12);
11369                                  unsigned length;
11370                                  SpacingType spacing = kSingle;
11371                                  switch ((instr >> 8) & 0xf) {
11372                                    default:
11373                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11374                                    case 0x7:
11375                                      length = 1;
11376                                      break;
11377                                    case 0xa:
11378                                      length = 2;
11379                                      break;
11380                                    case 0x6:
11381                                      length = 3;
11382                                      break;
11383                                    case 0x2:
11384                                      length = 4;
11385                                      break;
11386                                  }
11387                                  unsigned last = first + length - 1;
11388                                  TransferType transfer = kMultipleLanes;
11389                                  unsigned rn = (instr >> 16) & 0xf;
11390                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11391                                  vst1(CurrentCond(),
11392                                       dt,
11393                                       NeonRegisterList(DRegister(first),
11394                                                        DRegister(last),
11395                                                        spacing,
11396                                                        transfer),
11397                                       AlignedMemOperand(Register(rn),
11398                                                         align,
11399                                                         PostIndex));
11400                                  break;
11401                                }
11402                                case 0x00000300: {
11403                                  // 0xf900030d
11404                                  if (((instr & 0xe30) == 0x830)) {
11405                                    UnallocatedT32(instr);
11406                                    return;
11407                                  }
11408                                  DataType dt =
11409                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11410                                  if (dt.Is(kDataTypeValueInvalid)) {
11411                                    UnallocatedT32(instr);
11412                                    return;
11413                                  }
11414                                  Alignment align =
11415                                      Align_align_2_Decode((instr >> 4) & 0x3);
11416                                  if (dt.Is(kDataTypeValueInvalid) ||
11417                                      align.Is(kBadAlignment)) {
11418                                    UnallocatedT32(instr);
11419                                    return;
11420                                  }
11421                                  unsigned first =
11422                                      ExtractDRegister(instr, 22, 12);
11423                                  unsigned length;
11424                                  SpacingType spacing;
11425                                  switch ((instr >> 8) & 0xf) {
11426                                    default:
11427                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11428                                    case 0x8:
11429                                      length = 2;
11430                                      spacing = kSingle;
11431                                      break;
11432                                    case 0x9:
11433                                      length = 2;
11434                                      spacing = kDouble;
11435                                      break;
11436                                    case 0x3:
11437                                      length = 4;
11438                                      spacing = kSingle;
11439                                      break;
11440                                  }
11441                                  unsigned last =
11442                                      first +
11443                                      (length - 1) *
11444                                          (spacing == kSingle ? 1 : 2);
11445                                  TransferType transfer = kMultipleLanes;
11446                                  unsigned rn = (instr >> 16) & 0xf;
11447                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11448                                  vst2(CurrentCond(),
11449                                       dt,
11450                                       NeonRegisterList(DRegister(first),
11451                                                        DRegister(last),
11452                                                        spacing,
11453                                                        transfer),
11454                                       AlignedMemOperand(Register(rn),
11455                                                         align,
11456                                                         PostIndex));
11457                                  break;
11458                                }
11459                                case 0x00000400: {
11460                                  // 0xf900040d
11461                                  if (((instr & 0x20) == 0x20)) {
11462                                    UnallocatedT32(instr);
11463                                    return;
11464                                  }
11465                                  DataType dt =
11466                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11467                                  if (dt.Is(kDataTypeValueInvalid)) {
11468                                    UnallocatedT32(instr);
11469                                    return;
11470                                  }
11471                                  Alignment align =
11472                                      Align_align_3_Decode((instr >> 4) & 0x3);
11473                                  if (dt.Is(kDataTypeValueInvalid) ||
11474                                      align.Is(kBadAlignment)) {
11475                                    UnallocatedT32(instr);
11476                                    return;
11477                                  }
11478                                  unsigned first =
11479                                      ExtractDRegister(instr, 22, 12);
11480                                  unsigned length;
11481                                  SpacingType spacing;
11482                                  switch ((instr >> 8) & 0xf) {
11483                                    default:
11484                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11485                                    case 0x4:
11486                                      length = 3;
11487                                      spacing = kSingle;
11488                                      break;
11489                                    case 0x5:
11490                                      length = 3;
11491                                      spacing = kDouble;
11492                                      break;
11493                                  }
11494                                  unsigned last =
11495                                      first +
11496                                      (length - 1) *
11497                                          (spacing == kSingle ? 1 : 2);
11498                                  TransferType transfer = kMultipleLanes;
11499                                  unsigned rn = (instr >> 16) & 0xf;
11500                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11501                                  vst3(CurrentCond(),
11502                                       dt,
11503                                       NeonRegisterList(DRegister(first),
11504                                                        DRegister(last),
11505                                                        spacing,
11506                                                        transfer),
11507                                       AlignedMemOperand(Register(rn),
11508                                                         align,
11509                                                         PostIndex));
11510                                  break;
11511                                }
11512                                case 0x00000500: {
11513                                  // 0xf900050d
11514                                  if (((instr & 0x20) == 0x20)) {
11515                                    UnallocatedT32(instr);
11516                                    return;
11517                                  }
11518                                  DataType dt =
11519                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11520                                  if (dt.Is(kDataTypeValueInvalid)) {
11521                                    UnallocatedT32(instr);
11522                                    return;
11523                                  }
11524                                  Alignment align =
11525                                      Align_align_3_Decode((instr >> 4) & 0x3);
11526                                  if (dt.Is(kDataTypeValueInvalid) ||
11527                                      align.Is(kBadAlignment)) {
11528                                    UnallocatedT32(instr);
11529                                    return;
11530                                  }
11531                                  unsigned first =
11532                                      ExtractDRegister(instr, 22, 12);
11533                                  unsigned length;
11534                                  SpacingType spacing;
11535                                  switch ((instr >> 8) & 0xf) {
11536                                    default:
11537                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11538                                    case 0x4:
11539                                      length = 3;
11540                                      spacing = kSingle;
11541                                      break;
11542                                    case 0x5:
11543                                      length = 3;
11544                                      spacing = kDouble;
11545                                      break;
11546                                  }
11547                                  unsigned last =
11548                                      first +
11549                                      (length - 1) *
11550                                          (spacing == kSingle ? 1 : 2);
11551                                  TransferType transfer = kMultipleLanes;
11552                                  unsigned rn = (instr >> 16) & 0xf;
11553                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11554                                  vst3(CurrentCond(),
11555                                       dt,
11556                                       NeonRegisterList(DRegister(first),
11557                                                        DRegister(last),
11558                                                        spacing,
11559                                                        transfer),
11560                                       AlignedMemOperand(Register(rn),
11561                                                         align,
11562                                                         PostIndex));
11563                                  break;
11564                                }
11565                                case 0x00000600: {
11566                                  // 0xf900060d
11567                                  if (((instr & 0xe20) == 0x620) ||
11568                                      ((instr & 0xf30) == 0xa30)) {
11569                                    UnallocatedT32(instr);
11570                                    return;
11571                                  }
11572                                  DataType dt =
11573                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11574                                  if (dt.Is(kDataTypeValueInvalid)) {
11575                                    UnallocatedT32(instr);
11576                                    return;
11577                                  }
11578                                  Alignment align =
11579                                      Align_align_5_Decode((instr >> 4) & 0x3);
11580                                  if (dt.Is(kDataTypeValueInvalid) ||
11581                                      align.Is(kBadAlignment)) {
11582                                    UnallocatedT32(instr);
11583                                    return;
11584                                  }
11585                                  unsigned first =
11586                                      ExtractDRegister(instr, 22, 12);
11587                                  unsigned length;
11588                                  SpacingType spacing = kSingle;
11589                                  switch ((instr >> 8) & 0xf) {
11590                                    default:
11591                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11592                                    case 0x7:
11593                                      length = 1;
11594                                      break;
11595                                    case 0xa:
11596                                      length = 2;
11597                                      break;
11598                                    case 0x6:
11599                                      length = 3;
11600                                      break;
11601                                    case 0x2:
11602                                      length = 4;
11603                                      break;
11604                                  }
11605                                  unsigned last = first + length - 1;
11606                                  TransferType transfer = kMultipleLanes;
11607                                  unsigned rn = (instr >> 16) & 0xf;
11608                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11609                                  vst1(CurrentCond(),
11610                                       dt,
11611                                       NeonRegisterList(DRegister(first),
11612                                                        DRegister(last),
11613                                                        spacing,
11614                                                        transfer),
11615                                       AlignedMemOperand(Register(rn),
11616                                                         align,
11617                                                         PostIndex));
11618                                  break;
11619                                }
11620                                case 0x00000700: {
11621                                  // 0xf900070d
11622                                  if (((instr & 0xe20) == 0x620) ||
11623                                      ((instr & 0xf30) == 0xa30)) {
11624                                    UnallocatedT32(instr);
11625                                    return;
11626                                  }
11627                                  DataType dt =
11628                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11629                                  if (dt.Is(kDataTypeValueInvalid)) {
11630                                    UnallocatedT32(instr);
11631                                    return;
11632                                  }
11633                                  Alignment align =
11634                                      Align_align_5_Decode((instr >> 4) & 0x3);
11635                                  if (dt.Is(kDataTypeValueInvalid) ||
11636                                      align.Is(kBadAlignment)) {
11637                                    UnallocatedT32(instr);
11638                                    return;
11639                                  }
11640                                  unsigned first =
11641                                      ExtractDRegister(instr, 22, 12);
11642                                  unsigned length;
11643                                  SpacingType spacing = kSingle;
11644                                  switch ((instr >> 8) & 0xf) {
11645                                    default:
11646                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11647                                    case 0x7:
11648                                      length = 1;
11649                                      break;
11650                                    case 0xa:
11651                                      length = 2;
11652                                      break;
11653                                    case 0x6:
11654                                      length = 3;
11655                                      break;
11656                                    case 0x2:
11657                                      length = 4;
11658                                      break;
11659                                  }
11660                                  unsigned last = first + length - 1;
11661                                  TransferType transfer = kMultipleLanes;
11662                                  unsigned rn = (instr >> 16) & 0xf;
11663                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11664                                  vst1(CurrentCond(),
11665                                       dt,
11666                                       NeonRegisterList(DRegister(first),
11667                                                        DRegister(last),
11668                                                        spacing,
11669                                                        transfer),
11670                                       AlignedMemOperand(Register(rn),
11671                                                         align,
11672                                                         PostIndex));
11673                                  break;
11674                                }
11675                                case 0x00000800: {
11676                                  // 0xf900080d
11677                                  if (((instr & 0xe30) == 0x830)) {
11678                                    UnallocatedT32(instr);
11679                                    return;
11680                                  }
11681                                  DataType dt =
11682                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11683                                  if (dt.Is(kDataTypeValueInvalid)) {
11684                                    UnallocatedT32(instr);
11685                                    return;
11686                                  }
11687                                  Alignment align =
11688                                      Align_align_2_Decode((instr >> 4) & 0x3);
11689                                  if (dt.Is(kDataTypeValueInvalid) ||
11690                                      align.Is(kBadAlignment)) {
11691                                    UnallocatedT32(instr);
11692                                    return;
11693                                  }
11694                                  unsigned first =
11695                                      ExtractDRegister(instr, 22, 12);
11696                                  unsigned length;
11697                                  SpacingType spacing;
11698                                  switch ((instr >> 8) & 0xf) {
11699                                    default:
11700                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11701                                    case 0x8:
11702                                      length = 2;
11703                                      spacing = kSingle;
11704                                      break;
11705                                    case 0x9:
11706                                      length = 2;
11707                                      spacing = kDouble;
11708                                      break;
11709                                    case 0x3:
11710                                      length = 4;
11711                                      spacing = kSingle;
11712                                      break;
11713                                  }
11714                                  unsigned last =
11715                                      first +
11716                                      (length - 1) *
11717                                          (spacing == kSingle ? 1 : 2);
11718                                  TransferType transfer = kMultipleLanes;
11719                                  unsigned rn = (instr >> 16) & 0xf;
11720                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11721                                  vst2(CurrentCond(),
11722                                       dt,
11723                                       NeonRegisterList(DRegister(first),
11724                                                        DRegister(last),
11725                                                        spacing,
11726                                                        transfer),
11727                                       AlignedMemOperand(Register(rn),
11728                                                         align,
11729                                                         PostIndex));
11730                                  break;
11731                                }
11732                                case 0x00000900: {
11733                                  // 0xf900090d
11734                                  if (((instr & 0xe30) == 0x830)) {
11735                                    UnallocatedT32(instr);
11736                                    return;
11737                                  }
11738                                  DataType dt =
11739                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11740                                  if (dt.Is(kDataTypeValueInvalid)) {
11741                                    UnallocatedT32(instr);
11742                                    return;
11743                                  }
11744                                  Alignment align =
11745                                      Align_align_2_Decode((instr >> 4) & 0x3);
11746                                  if (dt.Is(kDataTypeValueInvalid) ||
11747                                      align.Is(kBadAlignment)) {
11748                                    UnallocatedT32(instr);
11749                                    return;
11750                                  }
11751                                  unsigned first =
11752                                      ExtractDRegister(instr, 22, 12);
11753                                  unsigned length;
11754                                  SpacingType spacing;
11755                                  switch ((instr >> 8) & 0xf) {
11756                                    default:
11757                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11758                                    case 0x8:
11759                                      length = 2;
11760                                      spacing = kSingle;
11761                                      break;
11762                                    case 0x9:
11763                                      length = 2;
11764                                      spacing = kDouble;
11765                                      break;
11766                                    case 0x3:
11767                                      length = 4;
11768                                      spacing = kSingle;
11769                                      break;
11770                                  }
11771                                  unsigned last =
11772                                      first +
11773                                      (length - 1) *
11774                                          (spacing == kSingle ? 1 : 2);
11775                                  TransferType transfer = kMultipleLanes;
11776                                  unsigned rn = (instr >> 16) & 0xf;
11777                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11778                                  vst2(CurrentCond(),
11779                                       dt,
11780                                       NeonRegisterList(DRegister(first),
11781                                                        DRegister(last),
11782                                                        spacing,
11783                                                        transfer),
11784                                       AlignedMemOperand(Register(rn),
11785                                                         align,
11786                                                         PostIndex));
11787                                  break;
11788                                }
11789                                case 0x00000a00: {
11790                                  // 0xf9000a0d
11791                                  if (((instr & 0xe20) == 0x620) ||
11792                                      ((instr & 0xf30) == 0xa30)) {
11793                                    UnallocatedT32(instr);
11794                                    return;
11795                                  }
11796                                  DataType dt =
11797                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11798                                  if (dt.Is(kDataTypeValueInvalid)) {
11799                                    UnallocatedT32(instr);
11800                                    return;
11801                                  }
11802                                  Alignment align =
11803                                      Align_align_5_Decode((instr >> 4) & 0x3);
11804                                  if (dt.Is(kDataTypeValueInvalid) ||
11805                                      align.Is(kBadAlignment)) {
11806                                    UnallocatedT32(instr);
11807                                    return;
11808                                  }
11809                                  unsigned first =
11810                                      ExtractDRegister(instr, 22, 12);
11811                                  unsigned length;
11812                                  SpacingType spacing = kSingle;
11813                                  switch ((instr >> 8) & 0xf) {
11814                                    default:
11815                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11816                                    case 0x7:
11817                                      length = 1;
11818                                      break;
11819                                    case 0xa:
11820                                      length = 2;
11821                                      break;
11822                                    case 0x6:
11823                                      length = 3;
11824                                      break;
11825                                    case 0x2:
11826                                      length = 4;
11827                                      break;
11828                                  }
11829                                  unsigned last = first + length - 1;
11830                                  TransferType transfer = kMultipleLanes;
11831                                  unsigned rn = (instr >> 16) & 0xf;
11832                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11833                                  vst1(CurrentCond(),
11834                                       dt,
11835                                       NeonRegisterList(DRegister(first),
11836                                                        DRegister(last),
11837                                                        spacing,
11838                                                        transfer),
11839                                       AlignedMemOperand(Register(rn),
11840                                                         align,
11841                                                         PostIndex));
11842                                  break;
11843                                }
11844                                default:
11845                                  UnallocatedT32(instr);
11846                                  break;
11847                              }
11848                              break;
11849                            }
11850                            case 0x00000002: {
11851                              // 0xf900000f
11852                              switch (instr & 0x00000f00) {
11853                                case 0x00000000: {
11854                                  // 0xf900000d
11855                                  DataType dt =
11856                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11857                                  if (dt.Is(kDataTypeValueInvalid)) {
11858                                    UnallocatedT32(instr);
11859                                    return;
11860                                  }
11861                                  Alignment align =
11862                                      Align_align_4_Decode((instr >> 4) & 0x3);
11863                                  if (dt.Is(kDataTypeValueInvalid) ||
11864                                      align.Is(kBadAlignment)) {
11865                                    UnallocatedT32(instr);
11866                                    return;
11867                                  }
11868                                  unsigned first =
11869                                      ExtractDRegister(instr, 22, 12);
11870                                  unsigned length;
11871                                  SpacingType spacing;
11872                                  switch ((instr >> 8) & 0xf) {
11873                                    default:
11874                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11875                                    case 0x0:
11876                                      length = 4;
11877                                      spacing = kSingle;
11878                                      break;
11879                                    case 0x1:
11880                                      length = 4;
11881                                      spacing = kDouble;
11882                                      break;
11883                                  }
11884                                  unsigned last =
11885                                      first +
11886                                      (length - 1) *
11887                                          (spacing == kSingle ? 1 : 2);
11888                                  TransferType transfer = kMultipleLanes;
11889                                  unsigned rn = (instr >> 16) & 0xf;
11890                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11891                                  vst4(CurrentCond(),
11892                                       dt,
11893                                       NeonRegisterList(DRegister(first),
11894                                                        DRegister(last),
11895                                                        spacing,
11896                                                        transfer),
11897                                       AlignedMemOperand(Register(rn),
11898                                                         align,
11899                                                         Offset));
11900                                  break;
11901                                }
11902                                case 0x00000100: {
11903                                  // 0xf900010d
11904                                  DataType dt =
11905                                      Dt_size_7_Decode((instr >> 6) & 0x3);
11906                                  if (dt.Is(kDataTypeValueInvalid)) {
11907                                    UnallocatedT32(instr);
11908                                    return;
11909                                  }
11910                                  Alignment align =
11911                                      Align_align_4_Decode((instr >> 4) & 0x3);
11912                                  if (dt.Is(kDataTypeValueInvalid) ||
11913                                      align.Is(kBadAlignment)) {
11914                                    UnallocatedT32(instr);
11915                                    return;
11916                                  }
11917                                  unsigned first =
11918                                      ExtractDRegister(instr, 22, 12);
11919                                  unsigned length;
11920                                  SpacingType spacing;
11921                                  switch ((instr >> 8) & 0xf) {
11922                                    default:
11923                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11924                                    case 0x0:
11925                                      length = 4;
11926                                      spacing = kSingle;
11927                                      break;
11928                                    case 0x1:
11929                                      length = 4;
11930                                      spacing = kDouble;
11931                                      break;
11932                                  }
11933                                  unsigned last =
11934                                      first +
11935                                      (length - 1) *
11936                                          (spacing == kSingle ? 1 : 2);
11937                                  TransferType transfer = kMultipleLanes;
11938                                  unsigned rn = (instr >> 16) & 0xf;
11939                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11940                                  vst4(CurrentCond(),
11941                                       dt,
11942                                       NeonRegisterList(DRegister(first),
11943                                                        DRegister(last),
11944                                                        spacing,
11945                                                        transfer),
11946                                       AlignedMemOperand(Register(rn),
11947                                                         align,
11948                                                         Offset));
11949                                  break;
11950                                }
11951                                case 0x00000200: {
11952                                  // 0xf900020d
11953                                  if (((instr & 0xe20) == 0x620) ||
11954                                      ((instr & 0xf30) == 0xa30)) {
11955                                    UnallocatedT32(instr);
11956                                    return;
11957                                  }
11958                                  DataType dt =
11959                                      Dt_size_6_Decode((instr >> 6) & 0x3);
11960                                  if (dt.Is(kDataTypeValueInvalid)) {
11961                                    UnallocatedT32(instr);
11962                                    return;
11963                                  }
11964                                  Alignment align =
11965                                      Align_align_5_Decode((instr >> 4) & 0x3);
11966                                  if (dt.Is(kDataTypeValueInvalid) ||
11967                                      align.Is(kBadAlignment)) {
11968                                    UnallocatedT32(instr);
11969                                    return;
11970                                  }
11971                                  unsigned first =
11972                                      ExtractDRegister(instr, 22, 12);
11973                                  unsigned length;
11974                                  SpacingType spacing = kSingle;
11975                                  switch ((instr >> 8) & 0xf) {
11976                                    default:
11977                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
11978                                    case 0x7:
11979                                      length = 1;
11980                                      break;
11981                                    case 0xa:
11982                                      length = 2;
11983                                      break;
11984                                    case 0x6:
11985                                      length = 3;
11986                                      break;
11987                                    case 0x2:
11988                                      length = 4;
11989                                      break;
11990                                  }
11991                                  unsigned last = first + length - 1;
11992                                  TransferType transfer = kMultipleLanes;
11993                                  unsigned rn = (instr >> 16) & 0xf;
11994                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11995                                  vst1(CurrentCond(),
11996                                       dt,
11997                                       NeonRegisterList(DRegister(first),
11998                                                        DRegister(last),
11999                                                        spacing,
12000                                                        transfer),
12001                                       AlignedMemOperand(Register(rn),
12002                                                         align,
12003                                                         Offset));
12004                                  break;
12005                                }
12006                                case 0x00000300: {
12007                                  // 0xf900030d
12008                                  if (((instr & 0xe30) == 0x830)) {
12009                                    UnallocatedT32(instr);
12010                                    return;
12011                                  }
12012                                  DataType dt =
12013                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12014                                  if (dt.Is(kDataTypeValueInvalid)) {
12015                                    UnallocatedT32(instr);
12016                                    return;
12017                                  }
12018                                  Alignment align =
12019                                      Align_align_2_Decode((instr >> 4) & 0x3);
12020                                  if (dt.Is(kDataTypeValueInvalid) ||
12021                                      align.Is(kBadAlignment)) {
12022                                    UnallocatedT32(instr);
12023                                    return;
12024                                  }
12025                                  unsigned first =
12026                                      ExtractDRegister(instr, 22, 12);
12027                                  unsigned length;
12028                                  SpacingType spacing;
12029                                  switch ((instr >> 8) & 0xf) {
12030                                    default:
12031                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12032                                    case 0x8:
12033                                      length = 2;
12034                                      spacing = kSingle;
12035                                      break;
12036                                    case 0x9:
12037                                      length = 2;
12038                                      spacing = kDouble;
12039                                      break;
12040                                    case 0x3:
12041                                      length = 4;
12042                                      spacing = kSingle;
12043                                      break;
12044                                  }
12045                                  unsigned last =
12046                                      first +
12047                                      (length - 1) *
12048                                          (spacing == kSingle ? 1 : 2);
12049                                  TransferType transfer = kMultipleLanes;
12050                                  unsigned rn = (instr >> 16) & 0xf;
12051                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12052                                  vst2(CurrentCond(),
12053                                       dt,
12054                                       NeonRegisterList(DRegister(first),
12055                                                        DRegister(last),
12056                                                        spacing,
12057                                                        transfer),
12058                                       AlignedMemOperand(Register(rn),
12059                                                         align,
12060                                                         Offset));
12061                                  break;
12062                                }
12063                                case 0x00000400: {
12064                                  // 0xf900040d
12065                                  if (((instr & 0x20) == 0x20)) {
12066                                    UnallocatedT32(instr);
12067                                    return;
12068                                  }
12069                                  DataType dt =
12070                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12071                                  if (dt.Is(kDataTypeValueInvalid)) {
12072                                    UnallocatedT32(instr);
12073                                    return;
12074                                  }
12075                                  Alignment align =
12076                                      Align_align_3_Decode((instr >> 4) & 0x3);
12077                                  if (dt.Is(kDataTypeValueInvalid) ||
12078                                      align.Is(kBadAlignment)) {
12079                                    UnallocatedT32(instr);
12080                                    return;
12081                                  }
12082                                  unsigned first =
12083                                      ExtractDRegister(instr, 22, 12);
12084                                  unsigned length;
12085                                  SpacingType spacing;
12086                                  switch ((instr >> 8) & 0xf) {
12087                                    default:
12088                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12089                                    case 0x4:
12090                                      length = 3;
12091                                      spacing = kSingle;
12092                                      break;
12093                                    case 0x5:
12094                                      length = 3;
12095                                      spacing = kDouble;
12096                                      break;
12097                                  }
12098                                  unsigned last =
12099                                      first +
12100                                      (length - 1) *
12101                                          (spacing == kSingle ? 1 : 2);
12102                                  TransferType transfer = kMultipleLanes;
12103                                  unsigned rn = (instr >> 16) & 0xf;
12104                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12105                                  vst3(CurrentCond(),
12106                                       dt,
12107                                       NeonRegisterList(DRegister(first),
12108                                                        DRegister(last),
12109                                                        spacing,
12110                                                        transfer),
12111                                       AlignedMemOperand(Register(rn),
12112                                                         align,
12113                                                         Offset));
12114                                  break;
12115                                }
12116                                case 0x00000500: {
12117                                  // 0xf900050d
12118                                  if (((instr & 0x20) == 0x20)) {
12119                                    UnallocatedT32(instr);
12120                                    return;
12121                                  }
12122                                  DataType dt =
12123                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12124                                  if (dt.Is(kDataTypeValueInvalid)) {
12125                                    UnallocatedT32(instr);
12126                                    return;
12127                                  }
12128                                  Alignment align =
12129                                      Align_align_3_Decode((instr >> 4) & 0x3);
12130                                  if (dt.Is(kDataTypeValueInvalid) ||
12131                                      align.Is(kBadAlignment)) {
12132                                    UnallocatedT32(instr);
12133                                    return;
12134                                  }
12135                                  unsigned first =
12136                                      ExtractDRegister(instr, 22, 12);
12137                                  unsigned length;
12138                                  SpacingType spacing;
12139                                  switch ((instr >> 8) & 0xf) {
12140                                    default:
12141                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12142                                    case 0x4:
12143                                      length = 3;
12144                                      spacing = kSingle;
12145                                      break;
12146                                    case 0x5:
12147                                      length = 3;
12148                                      spacing = kDouble;
12149                                      break;
12150                                  }
12151                                  unsigned last =
12152                                      first +
12153                                      (length - 1) *
12154                                          (spacing == kSingle ? 1 : 2);
12155                                  TransferType transfer = kMultipleLanes;
12156                                  unsigned rn = (instr >> 16) & 0xf;
12157                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12158                                  vst3(CurrentCond(),
12159                                       dt,
12160                                       NeonRegisterList(DRegister(first),
12161                                                        DRegister(last),
12162                                                        spacing,
12163                                                        transfer),
12164                                       AlignedMemOperand(Register(rn),
12165                                                         align,
12166                                                         Offset));
12167                                  break;
12168                                }
12169                                case 0x00000600: {
12170                                  // 0xf900060d
12171                                  if (((instr & 0xe20) == 0x620) ||
12172                                      ((instr & 0xf30) == 0xa30)) {
12173                                    UnallocatedT32(instr);
12174                                    return;
12175                                  }
12176                                  DataType dt =
12177                                      Dt_size_6_Decode((instr >> 6) & 0x3);
12178                                  if (dt.Is(kDataTypeValueInvalid)) {
12179                                    UnallocatedT32(instr);
12180                                    return;
12181                                  }
12182                                  Alignment align =
12183                                      Align_align_5_Decode((instr >> 4) & 0x3);
12184                                  if (dt.Is(kDataTypeValueInvalid) ||
12185                                      align.Is(kBadAlignment)) {
12186                                    UnallocatedT32(instr);
12187                                    return;
12188                                  }
12189                                  unsigned first =
12190                                      ExtractDRegister(instr, 22, 12);
12191                                  unsigned length;
12192                                  SpacingType spacing = kSingle;
12193                                  switch ((instr >> 8) & 0xf) {
12194                                    default:
12195                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12196                                    case 0x7:
12197                                      length = 1;
12198                                      break;
12199                                    case 0xa:
12200                                      length = 2;
12201                                      break;
12202                                    case 0x6:
12203                                      length = 3;
12204                                      break;
12205                                    case 0x2:
12206                                      length = 4;
12207                                      break;
12208                                  }
12209                                  unsigned last = first + length - 1;
12210                                  TransferType transfer = kMultipleLanes;
12211                                  unsigned rn = (instr >> 16) & 0xf;
12212                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12213                                  vst1(CurrentCond(),
12214                                       dt,
12215                                       NeonRegisterList(DRegister(first),
12216                                                        DRegister(last),
12217                                                        spacing,
12218                                                        transfer),
12219                                       AlignedMemOperand(Register(rn),
12220                                                         align,
12221                                                         Offset));
12222                                  break;
12223                                }
12224                                case 0x00000700: {
12225                                  // 0xf900070d
12226                                  if (((instr & 0xe20) == 0x620) ||
12227                                      ((instr & 0xf30) == 0xa30)) {
12228                                    UnallocatedT32(instr);
12229                                    return;
12230                                  }
12231                                  DataType dt =
12232                                      Dt_size_6_Decode((instr >> 6) & 0x3);
12233                                  if (dt.Is(kDataTypeValueInvalid)) {
12234                                    UnallocatedT32(instr);
12235                                    return;
12236                                  }
12237                                  Alignment align =
12238                                      Align_align_5_Decode((instr >> 4) & 0x3);
12239                                  if (dt.Is(kDataTypeValueInvalid) ||
12240                                      align.Is(kBadAlignment)) {
12241                                    UnallocatedT32(instr);
12242                                    return;
12243                                  }
12244                                  unsigned first =
12245                                      ExtractDRegister(instr, 22, 12);
12246                                  unsigned length;
12247                                  SpacingType spacing = kSingle;
12248                                  switch ((instr >> 8) & 0xf) {
12249                                    default:
12250                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12251                                    case 0x7:
12252                                      length = 1;
12253                                      break;
12254                                    case 0xa:
12255                                      length = 2;
12256                                      break;
12257                                    case 0x6:
12258                                      length = 3;
12259                                      break;
12260                                    case 0x2:
12261                                      length = 4;
12262                                      break;
12263                                  }
12264                                  unsigned last = first + length - 1;
12265                                  TransferType transfer = kMultipleLanes;
12266                                  unsigned rn = (instr >> 16) & 0xf;
12267                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12268                                  vst1(CurrentCond(),
12269                                       dt,
12270                                       NeonRegisterList(DRegister(first),
12271                                                        DRegister(last),
12272                                                        spacing,
12273                                                        transfer),
12274                                       AlignedMemOperand(Register(rn),
12275                                                         align,
12276                                                         Offset));
12277                                  break;
12278                                }
12279                                case 0x00000800: {
12280                                  // 0xf900080d
12281                                  if (((instr & 0xe30) == 0x830)) {
12282                                    UnallocatedT32(instr);
12283                                    return;
12284                                  }
12285                                  DataType dt =
12286                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12287                                  if (dt.Is(kDataTypeValueInvalid)) {
12288                                    UnallocatedT32(instr);
12289                                    return;
12290                                  }
12291                                  Alignment align =
12292                                      Align_align_2_Decode((instr >> 4) & 0x3);
12293                                  if (dt.Is(kDataTypeValueInvalid) ||
12294                                      align.Is(kBadAlignment)) {
12295                                    UnallocatedT32(instr);
12296                                    return;
12297                                  }
12298                                  unsigned first =
12299                                      ExtractDRegister(instr, 22, 12);
12300                                  unsigned length;
12301                                  SpacingType spacing;
12302                                  switch ((instr >> 8) & 0xf) {
12303                                    default:
12304                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12305                                    case 0x8:
12306                                      length = 2;
12307                                      spacing = kSingle;
12308                                      break;
12309                                    case 0x9:
12310                                      length = 2;
12311                                      spacing = kDouble;
12312                                      break;
12313                                    case 0x3:
12314                                      length = 4;
12315                                      spacing = kSingle;
12316                                      break;
12317                                  }
12318                                  unsigned last =
12319                                      first +
12320                                      (length - 1) *
12321                                          (spacing == kSingle ? 1 : 2);
12322                                  TransferType transfer = kMultipleLanes;
12323                                  unsigned rn = (instr >> 16) & 0xf;
12324                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12325                                  vst2(CurrentCond(),
12326                                       dt,
12327                                       NeonRegisterList(DRegister(first),
12328                                                        DRegister(last),
12329                                                        spacing,
12330                                                        transfer),
12331                                       AlignedMemOperand(Register(rn),
12332                                                         align,
12333                                                         Offset));
12334                                  break;
12335                                }
12336                                case 0x00000900: {
12337                                  // 0xf900090d
12338                                  if (((instr & 0xe30) == 0x830)) {
12339                                    UnallocatedT32(instr);
12340                                    return;
12341                                  }
12342                                  DataType dt =
12343                                      Dt_size_7_Decode((instr >> 6) & 0x3);
12344                                  if (dt.Is(kDataTypeValueInvalid)) {
12345                                    UnallocatedT32(instr);
12346                                    return;
12347                                  }
12348                                  Alignment align =
12349                                      Align_align_2_Decode((instr >> 4) & 0x3);
12350                                  if (dt.Is(kDataTypeValueInvalid) ||
12351                                      align.Is(kBadAlignment)) {
12352                                    UnallocatedT32(instr);
12353                                    return;
12354                                  }
12355                                  unsigned first =
12356                                      ExtractDRegister(instr, 22, 12);
12357                                  unsigned length;
12358                                  SpacingType spacing;
12359                                  switch ((instr >> 8) & 0xf) {
12360                                    default:
12361                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12362                                    case 0x8:
12363                                      length = 2;
12364                                      spacing = kSingle;
12365                                      break;
12366                                    case 0x9:
12367                                      length = 2;
12368                                      spacing = kDouble;
12369                                      break;
12370                                    case 0x3:
12371                                      length = 4;
12372                                      spacing = kSingle;
12373                                      break;
12374                                  }
12375                                  unsigned last =
12376                                      first +
12377                                      (length - 1) *
12378                                          (spacing == kSingle ? 1 : 2);
12379                                  TransferType transfer = kMultipleLanes;
12380                                  unsigned rn = (instr >> 16) & 0xf;
12381                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12382                                  vst2(CurrentCond(),
12383                                       dt,
12384                                       NeonRegisterList(DRegister(first),
12385                                                        DRegister(last),
12386                                                        spacing,
12387                                                        transfer),
12388                                       AlignedMemOperand(Register(rn),
12389                                                         align,
12390                                                         Offset));
12391                                  break;
12392                                }
12393                                case 0x00000a00: {
12394                                  // 0xf9000a0d
12395                                  if (((instr & 0xe20) == 0x620) ||
12396                                      ((instr & 0xf30) == 0xa30)) {
12397                                    UnallocatedT32(instr);
12398                                    return;
12399                                  }
12400                                  DataType dt =
12401                                      Dt_size_6_Decode((instr >> 6) & 0x3);
12402                                  if (dt.Is(kDataTypeValueInvalid)) {
12403                                    UnallocatedT32(instr);
12404                                    return;
12405                                  }
12406                                  Alignment align =
12407                                      Align_align_5_Decode((instr >> 4) & 0x3);
12408                                  if (dt.Is(kDataTypeValueInvalid) ||
12409                                      align.Is(kBadAlignment)) {
12410                                    UnallocatedT32(instr);
12411                                    return;
12412                                  }
12413                                  unsigned first =
12414                                      ExtractDRegister(instr, 22, 12);
12415                                  unsigned length;
12416                                  SpacingType spacing = kSingle;
12417                                  switch ((instr >> 8) & 0xf) {
12418                                    default:
12419                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
12420                                    case 0x7:
12421                                      length = 1;
12422                                      break;
12423                                    case 0xa:
12424                                      length = 2;
12425                                      break;
12426                                    case 0x6:
12427                                      length = 3;
12428                                      break;
12429                                    case 0x2:
12430                                      length = 4;
12431                                      break;
12432                                  }
12433                                  unsigned last = first + length - 1;
12434                                  TransferType transfer = kMultipleLanes;
12435                                  unsigned rn = (instr >> 16) & 0xf;
12436                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12437                                  vst1(CurrentCond(),
12438                                       dt,
12439                                       NeonRegisterList(DRegister(first),
12440                                                        DRegister(last),
12441                                                        spacing,
12442                                                        transfer),
12443                                       AlignedMemOperand(Register(rn),
12444                                                         align,
12445                                                         Offset));
12446                                  break;
12447                                }
12448                                default:
12449                                  UnallocatedT32(instr);
12450                                  break;
12451                              }
12452                              break;
12453                            }
12454                          }
12455                          break;
12456                        }
12457                        default: {
12458                          switch (instr & 0x00000f00) {
12459                            case 0x00000000: {
12460                              // 0xf9000000
12461                              if (((instr & 0xd) == 0xd)) {
12462                                UnallocatedT32(instr);
12463                                return;
12464                              }
12465                              DataType dt =
12466                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12467                              if (dt.Is(kDataTypeValueInvalid)) {
12468                                UnallocatedT32(instr);
12469                                return;
12470                              }
12471                              Alignment align =
12472                                  Align_align_4_Decode((instr >> 4) & 0x3);
12473                              if (dt.Is(kDataTypeValueInvalid) ||
12474                                  align.Is(kBadAlignment)) {
12475                                UnallocatedT32(instr);
12476                                return;
12477                              }
12478                              unsigned first = ExtractDRegister(instr, 22, 12);
12479                              unsigned length;
12480                              SpacingType spacing;
12481                              switch ((instr >> 8) & 0xf) {
12482                                default:
12483                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12484                                case 0x0:
12485                                  length = 4;
12486                                  spacing = kSingle;
12487                                  break;
12488                                case 0x1:
12489                                  length = 4;
12490                                  spacing = kDouble;
12491                                  break;
12492                              }
12493                              unsigned last =
12494                                  first +
12495                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12496                              TransferType transfer = kMultipleLanes;
12497                              unsigned rn = (instr >> 16) & 0xf;
12498                              unsigned rm = instr & 0xf;
12499                              // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12500                              vst4(CurrentCond(),
12501                                   dt,
12502                                   NeonRegisterList(DRegister(first),
12503                                                    DRegister(last),
12504                                                    spacing,
12505                                                    transfer),
12506                                   AlignedMemOperand(Register(rn),
12507                                                     align,
12508                                                     Register(rm),
12509                                                     PostIndex));
12510                              break;
12511                            }
12512                            case 0x00000100: {
12513                              // 0xf9000100
12514                              if (((instr & 0xd) == 0xd)) {
12515                                UnallocatedT32(instr);
12516                                return;
12517                              }
12518                              DataType dt =
12519                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12520                              if (dt.Is(kDataTypeValueInvalid)) {
12521                                UnallocatedT32(instr);
12522                                return;
12523                              }
12524                              Alignment align =
12525                                  Align_align_4_Decode((instr >> 4) & 0x3);
12526                              if (dt.Is(kDataTypeValueInvalid) ||
12527                                  align.Is(kBadAlignment)) {
12528                                UnallocatedT32(instr);
12529                                return;
12530                              }
12531                              unsigned first = ExtractDRegister(instr, 22, 12);
12532                              unsigned length;
12533                              SpacingType spacing;
12534                              switch ((instr >> 8) & 0xf) {
12535                                default:
12536                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12537                                case 0x0:
12538                                  length = 4;
12539                                  spacing = kSingle;
12540                                  break;
12541                                case 0x1:
12542                                  length = 4;
12543                                  spacing = kDouble;
12544                                  break;
12545                              }
12546                              unsigned last =
12547                                  first +
12548                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12549                              TransferType transfer = kMultipleLanes;
12550                              unsigned rn = (instr >> 16) & 0xf;
12551                              unsigned rm = instr & 0xf;
12552                              // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12553                              vst4(CurrentCond(),
12554                                   dt,
12555                                   NeonRegisterList(DRegister(first),
12556                                                    DRegister(last),
12557                                                    spacing,
12558                                                    transfer),
12559                                   AlignedMemOperand(Register(rn),
12560                                                     align,
12561                                                     Register(rm),
12562                                                     PostIndex));
12563                              break;
12564                            }
12565                            case 0x00000200: {
12566                              // 0xf9000200
12567                              if (((instr & 0xd) == 0xd) ||
12568                                  ((instr & 0xe20) == 0x620) ||
12569                                  ((instr & 0xf30) == 0xa30)) {
12570                                UnallocatedT32(instr);
12571                                return;
12572                              }
12573                              DataType dt =
12574                                  Dt_size_6_Decode((instr >> 6) & 0x3);
12575                              if (dt.Is(kDataTypeValueInvalid)) {
12576                                UnallocatedT32(instr);
12577                                return;
12578                              }
12579                              Alignment align =
12580                                  Align_align_5_Decode((instr >> 4) & 0x3);
12581                              if (dt.Is(kDataTypeValueInvalid) ||
12582                                  align.Is(kBadAlignment)) {
12583                                UnallocatedT32(instr);
12584                                return;
12585                              }
12586                              unsigned first = ExtractDRegister(instr, 22, 12);
12587                              unsigned length;
12588                              SpacingType spacing = kSingle;
12589                              switch ((instr >> 8) & 0xf) {
12590                                default:
12591                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12592                                case 0x7:
12593                                  length = 1;
12594                                  break;
12595                                case 0xa:
12596                                  length = 2;
12597                                  break;
12598                                case 0x6:
12599                                  length = 3;
12600                                  break;
12601                                case 0x2:
12602                                  length = 4;
12603                                  break;
12604                              }
12605                              unsigned last = first + length - 1;
12606                              TransferType transfer = kMultipleLanes;
12607                              unsigned rn = (instr >> 16) & 0xf;
12608                              unsigned rm = instr & 0xf;
12609                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12610                              vst1(CurrentCond(),
12611                                   dt,
12612                                   NeonRegisterList(DRegister(first),
12613                                                    DRegister(last),
12614                                                    spacing,
12615                                                    transfer),
12616                                   AlignedMemOperand(Register(rn),
12617                                                     align,
12618                                                     Register(rm),
12619                                                     PostIndex));
12620                              break;
12621                            }
12622                            case 0x00000300: {
12623                              // 0xf9000300
12624                              if (((instr & 0xd) == 0xd) ||
12625                                  ((instr & 0xe30) == 0x830)) {
12626                                UnallocatedT32(instr);
12627                                return;
12628                              }
12629                              DataType dt =
12630                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12631                              if (dt.Is(kDataTypeValueInvalid)) {
12632                                UnallocatedT32(instr);
12633                                return;
12634                              }
12635                              Alignment align =
12636                                  Align_align_2_Decode((instr >> 4) & 0x3);
12637                              if (dt.Is(kDataTypeValueInvalid) ||
12638                                  align.Is(kBadAlignment)) {
12639                                UnallocatedT32(instr);
12640                                return;
12641                              }
12642                              unsigned first = ExtractDRegister(instr, 22, 12);
12643                              unsigned length;
12644                              SpacingType spacing;
12645                              switch ((instr >> 8) & 0xf) {
12646                                default:
12647                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12648                                case 0x8:
12649                                  length = 2;
12650                                  spacing = kSingle;
12651                                  break;
12652                                case 0x9:
12653                                  length = 2;
12654                                  spacing = kDouble;
12655                                  break;
12656                                case 0x3:
12657                                  length = 4;
12658                                  spacing = kSingle;
12659                                  break;
12660                              }
12661                              unsigned last =
12662                                  first +
12663                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12664                              TransferType transfer = kMultipleLanes;
12665                              unsigned rn = (instr >> 16) & 0xf;
12666                              unsigned rm = instr & 0xf;
12667                              // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12668                              vst2(CurrentCond(),
12669                                   dt,
12670                                   NeonRegisterList(DRegister(first),
12671                                                    DRegister(last),
12672                                                    spacing,
12673                                                    transfer),
12674                                   AlignedMemOperand(Register(rn),
12675                                                     align,
12676                                                     Register(rm),
12677                                                     PostIndex));
12678                              break;
12679                            }
12680                            case 0x00000400: {
12681                              // 0xf9000400
12682                              if (((instr & 0xd) == 0xd) ||
12683                                  ((instr & 0x20) == 0x20)) {
12684                                UnallocatedT32(instr);
12685                                return;
12686                              }
12687                              DataType dt =
12688                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12689                              if (dt.Is(kDataTypeValueInvalid)) {
12690                                UnallocatedT32(instr);
12691                                return;
12692                              }
12693                              Alignment align =
12694                                  Align_align_3_Decode((instr >> 4) & 0x3);
12695                              if (dt.Is(kDataTypeValueInvalid) ||
12696                                  align.Is(kBadAlignment)) {
12697                                UnallocatedT32(instr);
12698                                return;
12699                              }
12700                              unsigned first = ExtractDRegister(instr, 22, 12);
12701                              unsigned length;
12702                              SpacingType spacing;
12703                              switch ((instr >> 8) & 0xf) {
12704                                default:
12705                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12706                                case 0x4:
12707                                  length = 3;
12708                                  spacing = kSingle;
12709                                  break;
12710                                case 0x5:
12711                                  length = 3;
12712                                  spacing = kDouble;
12713                                  break;
12714                              }
12715                              unsigned last =
12716                                  first +
12717                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12718                              TransferType transfer = kMultipleLanes;
12719                              unsigned rn = (instr >> 16) & 0xf;
12720                              unsigned rm = instr & 0xf;
12721                              // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12722                              vst3(CurrentCond(),
12723                                   dt,
12724                                   NeonRegisterList(DRegister(first),
12725                                                    DRegister(last),
12726                                                    spacing,
12727                                                    transfer),
12728                                   AlignedMemOperand(Register(rn),
12729                                                     align,
12730                                                     Register(rm),
12731                                                     PostIndex));
12732                              break;
12733                            }
12734                            case 0x00000500: {
12735                              // 0xf9000500
12736                              if (((instr & 0xd) == 0xd) ||
12737                                  ((instr & 0x20) == 0x20)) {
12738                                UnallocatedT32(instr);
12739                                return;
12740                              }
12741                              DataType dt =
12742                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12743                              if (dt.Is(kDataTypeValueInvalid)) {
12744                                UnallocatedT32(instr);
12745                                return;
12746                              }
12747                              Alignment align =
12748                                  Align_align_3_Decode((instr >> 4) & 0x3);
12749                              if (dt.Is(kDataTypeValueInvalid) ||
12750                                  align.Is(kBadAlignment)) {
12751                                UnallocatedT32(instr);
12752                                return;
12753                              }
12754                              unsigned first = ExtractDRegister(instr, 22, 12);
12755                              unsigned length;
12756                              SpacingType spacing;
12757                              switch ((instr >> 8) & 0xf) {
12758                                default:
12759                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12760                                case 0x4:
12761                                  length = 3;
12762                                  spacing = kSingle;
12763                                  break;
12764                                case 0x5:
12765                                  length = 3;
12766                                  spacing = kDouble;
12767                                  break;
12768                              }
12769                              unsigned last =
12770                                  first +
12771                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12772                              TransferType transfer = kMultipleLanes;
12773                              unsigned rn = (instr >> 16) & 0xf;
12774                              unsigned rm = instr & 0xf;
12775                              // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12776                              vst3(CurrentCond(),
12777                                   dt,
12778                                   NeonRegisterList(DRegister(first),
12779                                                    DRegister(last),
12780                                                    spacing,
12781                                                    transfer),
12782                                   AlignedMemOperand(Register(rn),
12783                                                     align,
12784                                                     Register(rm),
12785                                                     PostIndex));
12786                              break;
12787                            }
12788                            case 0x00000600: {
12789                              // 0xf9000600
12790                              if (((instr & 0xd) == 0xd) ||
12791                                  ((instr & 0xe20) == 0x620) ||
12792                                  ((instr & 0xf30) == 0xa30)) {
12793                                UnallocatedT32(instr);
12794                                return;
12795                              }
12796                              DataType dt =
12797                                  Dt_size_6_Decode((instr >> 6) & 0x3);
12798                              if (dt.Is(kDataTypeValueInvalid)) {
12799                                UnallocatedT32(instr);
12800                                return;
12801                              }
12802                              Alignment align =
12803                                  Align_align_5_Decode((instr >> 4) & 0x3);
12804                              if (dt.Is(kDataTypeValueInvalid) ||
12805                                  align.Is(kBadAlignment)) {
12806                                UnallocatedT32(instr);
12807                                return;
12808                              }
12809                              unsigned first = ExtractDRegister(instr, 22, 12);
12810                              unsigned length;
12811                              SpacingType spacing = kSingle;
12812                              switch ((instr >> 8) & 0xf) {
12813                                default:
12814                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12815                                case 0x7:
12816                                  length = 1;
12817                                  break;
12818                                case 0xa:
12819                                  length = 2;
12820                                  break;
12821                                case 0x6:
12822                                  length = 3;
12823                                  break;
12824                                case 0x2:
12825                                  length = 4;
12826                                  break;
12827                              }
12828                              unsigned last = first + length - 1;
12829                              TransferType transfer = kMultipleLanes;
12830                              unsigned rn = (instr >> 16) & 0xf;
12831                              unsigned rm = instr & 0xf;
12832                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12833                              vst1(CurrentCond(),
12834                                   dt,
12835                                   NeonRegisterList(DRegister(first),
12836                                                    DRegister(last),
12837                                                    spacing,
12838                                                    transfer),
12839                                   AlignedMemOperand(Register(rn),
12840                                                     align,
12841                                                     Register(rm),
12842                                                     PostIndex));
12843                              break;
12844                            }
12845                            case 0x00000700: {
12846                              // 0xf9000700
12847                              if (((instr & 0xd) == 0xd) ||
12848                                  ((instr & 0xe20) == 0x620) ||
12849                                  ((instr & 0xf30) == 0xa30)) {
12850                                UnallocatedT32(instr);
12851                                return;
12852                              }
12853                              DataType dt =
12854                                  Dt_size_6_Decode((instr >> 6) & 0x3);
12855                              if (dt.Is(kDataTypeValueInvalid)) {
12856                                UnallocatedT32(instr);
12857                                return;
12858                              }
12859                              Alignment align =
12860                                  Align_align_5_Decode((instr >> 4) & 0x3);
12861                              if (dt.Is(kDataTypeValueInvalid) ||
12862                                  align.Is(kBadAlignment)) {
12863                                UnallocatedT32(instr);
12864                                return;
12865                              }
12866                              unsigned first = ExtractDRegister(instr, 22, 12);
12867                              unsigned length;
12868                              SpacingType spacing = kSingle;
12869                              switch ((instr >> 8) & 0xf) {
12870                                default:
12871                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12872                                case 0x7:
12873                                  length = 1;
12874                                  break;
12875                                case 0xa:
12876                                  length = 2;
12877                                  break;
12878                                case 0x6:
12879                                  length = 3;
12880                                  break;
12881                                case 0x2:
12882                                  length = 4;
12883                                  break;
12884                              }
12885                              unsigned last = first + length - 1;
12886                              TransferType transfer = kMultipleLanes;
12887                              unsigned rn = (instr >> 16) & 0xf;
12888                              unsigned rm = instr & 0xf;
12889                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12890                              vst1(CurrentCond(),
12891                                   dt,
12892                                   NeonRegisterList(DRegister(first),
12893                                                    DRegister(last),
12894                                                    spacing,
12895                                                    transfer),
12896                                   AlignedMemOperand(Register(rn),
12897                                                     align,
12898                                                     Register(rm),
12899                                                     PostIndex));
12900                              break;
12901                            }
12902                            case 0x00000800: {
12903                              // 0xf9000800
12904                              if (((instr & 0xd) == 0xd) ||
12905                                  ((instr & 0xe30) == 0x830)) {
12906                                UnallocatedT32(instr);
12907                                return;
12908                              }
12909                              DataType dt =
12910                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12911                              if (dt.Is(kDataTypeValueInvalid)) {
12912                                UnallocatedT32(instr);
12913                                return;
12914                              }
12915                              Alignment align =
12916                                  Align_align_2_Decode((instr >> 4) & 0x3);
12917                              if (dt.Is(kDataTypeValueInvalid) ||
12918                                  align.Is(kBadAlignment)) {
12919                                UnallocatedT32(instr);
12920                                return;
12921                              }
12922                              unsigned first = ExtractDRegister(instr, 22, 12);
12923                              unsigned length;
12924                              SpacingType spacing;
12925                              switch ((instr >> 8) & 0xf) {
12926                                default:
12927                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12928                                case 0x8:
12929                                  length = 2;
12930                                  spacing = kSingle;
12931                                  break;
12932                                case 0x9:
12933                                  length = 2;
12934                                  spacing = kDouble;
12935                                  break;
12936                                case 0x3:
12937                                  length = 4;
12938                                  spacing = kSingle;
12939                                  break;
12940                              }
12941                              unsigned last =
12942                                  first +
12943                                  (length - 1) * (spacing == kSingle ? 1 : 2);
12944                              TransferType transfer = kMultipleLanes;
12945                              unsigned rn = (instr >> 16) & 0xf;
12946                              unsigned rm = instr & 0xf;
12947                              // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12948                              vst2(CurrentCond(),
12949                                   dt,
12950                                   NeonRegisterList(DRegister(first),
12951                                                    DRegister(last),
12952                                                    spacing,
12953                                                    transfer),
12954                                   AlignedMemOperand(Register(rn),
12955                                                     align,
12956                                                     Register(rm),
12957                                                     PostIndex));
12958                              break;
12959                            }
12960                            case 0x00000900: {
12961                              // 0xf9000900
12962                              if (((instr & 0xd) == 0xd) ||
12963                                  ((instr & 0xe30) == 0x830)) {
12964                                UnallocatedT32(instr);
12965                                return;
12966                              }
12967                              DataType dt =
12968                                  Dt_size_7_Decode((instr >> 6) & 0x3);
12969                              if (dt.Is(kDataTypeValueInvalid)) {
12970                                UnallocatedT32(instr);
12971                                return;
12972                              }
12973                              Alignment align =
12974                                  Align_align_2_Decode((instr >> 4) & 0x3);
12975                              if (dt.Is(kDataTypeValueInvalid) ||
12976                                  align.Is(kBadAlignment)) {
12977                                UnallocatedT32(instr);
12978                                return;
12979                              }
12980                              unsigned first = ExtractDRegister(instr, 22, 12);
12981                              unsigned length;
12982                              SpacingType spacing;
12983                              switch ((instr >> 8) & 0xf) {
12984                                default:
12985                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
12986                                case 0x8:
12987                                  length = 2;
12988                                  spacing = kSingle;
12989                                  break;
12990                                case 0x9:
12991                                  length = 2;
12992                                  spacing = kDouble;
12993                                  break;
12994                                case 0x3:
12995                                  length = 4;
12996                                  spacing = kSingle;
12997                                  break;
12998                              }
12999                              unsigned last =
13000                                  first +
13001                                  (length - 1) * (spacing == kSingle ? 1 : 2);
13002                              TransferType transfer = kMultipleLanes;
13003                              unsigned rn = (instr >> 16) & 0xf;
13004                              unsigned rm = instr & 0xf;
13005                              // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
13006                              vst2(CurrentCond(),
13007                                   dt,
13008                                   NeonRegisterList(DRegister(first),
13009                                                    DRegister(last),
13010                                                    spacing,
13011                                                    transfer),
13012                                   AlignedMemOperand(Register(rn),
13013                                                     align,
13014                                                     Register(rm),
13015                                                     PostIndex));
13016                              break;
13017                            }
13018                            case 0x00000a00: {
13019                              // 0xf9000a00
13020                              if (((instr & 0xd) == 0xd) ||
13021                                  ((instr & 0xe20) == 0x620) ||
13022                                  ((instr & 0xf30) == 0xa30)) {
13023                                UnallocatedT32(instr);
13024                                return;
13025                              }
13026                              DataType dt =
13027                                  Dt_size_6_Decode((instr >> 6) & 0x3);
13028                              if (dt.Is(kDataTypeValueInvalid)) {
13029                                UnallocatedT32(instr);
13030                                return;
13031                              }
13032                              Alignment align =
13033                                  Align_align_5_Decode((instr >> 4) & 0x3);
13034                              if (dt.Is(kDataTypeValueInvalid) ||
13035                                  align.Is(kBadAlignment)) {
13036                                UnallocatedT32(instr);
13037                                return;
13038                              }
13039                              unsigned first = ExtractDRegister(instr, 22, 12);
13040                              unsigned length;
13041                              SpacingType spacing = kSingle;
13042                              switch ((instr >> 8) & 0xf) {
13043                                default:
13044                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
13045                                case 0x7:
13046                                  length = 1;
13047                                  break;
13048                                case 0xa:
13049                                  length = 2;
13050                                  break;
13051                                case 0x6:
13052                                  length = 3;
13053                                  break;
13054                                case 0x2:
13055                                  length = 4;
13056                                  break;
13057                              }
13058                              unsigned last = first + length - 1;
13059                              TransferType transfer = kMultipleLanes;
13060                              unsigned rn = (instr >> 16) & 0xf;
13061                              unsigned rm = instr & 0xf;
13062                              // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
13063                              vst1(CurrentCond(),
13064                                   dt,
13065                                   NeonRegisterList(DRegister(first),
13066                                                    DRegister(last),
13067                                                    spacing,
13068                                                    transfer),
13069                                   AlignedMemOperand(Register(rn),
13070                                                     align,
13071                                                     Register(rm),
13072                                                     PostIndex));
13073                              break;
13074                            }
13075                            default:
13076                              UnallocatedT32(instr);
13077                              break;
13078                          }
13079                          break;
13080                        }
13081                      }
13082                      break;
13083                    }
13084                    case 0x01200000: {
13085                      // 0xf9200000
13086                      switch (instr & 0x0000000d) {
13087                        case 0x0000000d: {
13088                          // 0xf920000d
13089                          switch (instr & 0x00000002) {
13090                            case 0x00000000: {
13091                              // 0xf920000d
13092                              switch (instr & 0x00000f00) {
13093                                case 0x00000000: {
13094                                  // 0xf920000d
13095                                  DataType dt =
13096                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13097                                  if (dt.Is(kDataTypeValueInvalid)) {
13098                                    UnallocatedT32(instr);
13099                                    return;
13100                                  }
13101                                  Alignment align =
13102                                      Align_align_4_Decode((instr >> 4) & 0x3);
13103                                  if (dt.Is(kDataTypeValueInvalid) ||
13104                                      align.Is(kBadAlignment)) {
13105                                    UnallocatedT32(instr);
13106                                    return;
13107                                  }
13108                                  unsigned first =
13109                                      ExtractDRegister(instr, 22, 12);
13110                                  unsigned length;
13111                                  SpacingType spacing;
13112                                  switch ((instr >> 8) & 0xf) {
13113                                    default:
13114                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13115                                    case 0x0:
13116                                      length = 4;
13117                                      spacing = kSingle;
13118                                      break;
13119                                    case 0x1:
13120                                      length = 4;
13121                                      spacing = kDouble;
13122                                      break;
13123                                  }
13124                                  unsigned last =
13125                                      first +
13126                                      (length - 1) *
13127                                          (spacing == kSingle ? 1 : 2);
13128                                  TransferType transfer = kMultipleLanes;
13129                                  unsigned rn = (instr >> 16) & 0xf;
13130                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13131                                  vld4(CurrentCond(),
13132                                       dt,
13133                                       NeonRegisterList(DRegister(first),
13134                                                        DRegister(last),
13135                                                        spacing,
13136                                                        transfer),
13137                                       AlignedMemOperand(Register(rn),
13138                                                         align,
13139                                                         PostIndex));
13140                                  break;
13141                                }
13142                                case 0x00000100: {
13143                                  // 0xf920010d
13144                                  DataType dt =
13145                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13146                                  if (dt.Is(kDataTypeValueInvalid)) {
13147                                    UnallocatedT32(instr);
13148                                    return;
13149                                  }
13150                                  Alignment align =
13151                                      Align_align_4_Decode((instr >> 4) & 0x3);
13152                                  if (dt.Is(kDataTypeValueInvalid) ||
13153                                      align.Is(kBadAlignment)) {
13154                                    UnallocatedT32(instr);
13155                                    return;
13156                                  }
13157                                  unsigned first =
13158                                      ExtractDRegister(instr, 22, 12);
13159                                  unsigned length;
13160                                  SpacingType spacing;
13161                                  switch ((instr >> 8) & 0xf) {
13162                                    default:
13163                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13164                                    case 0x0:
13165                                      length = 4;
13166                                      spacing = kSingle;
13167                                      break;
13168                                    case 0x1:
13169                                      length = 4;
13170                                      spacing = kDouble;
13171                                      break;
13172                                  }
13173                                  unsigned last =
13174                                      first +
13175                                      (length - 1) *
13176                                          (spacing == kSingle ? 1 : 2);
13177                                  TransferType transfer = kMultipleLanes;
13178                                  unsigned rn = (instr >> 16) & 0xf;
13179                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13180                                  vld4(CurrentCond(),
13181                                       dt,
13182                                       NeonRegisterList(DRegister(first),
13183                                                        DRegister(last),
13184                                                        spacing,
13185                                                        transfer),
13186                                       AlignedMemOperand(Register(rn),
13187                                                         align,
13188                                                         PostIndex));
13189                                  break;
13190                                }
13191                                case 0x00000200: {
13192                                  // 0xf920020d
13193                                  if (((instr & 0xe20) == 0x620) ||
13194                                      ((instr & 0xf30) == 0xa30)) {
13195                                    UnallocatedT32(instr);
13196                                    return;
13197                                  }
13198                                  DataType dt =
13199                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13200                                  if (dt.Is(kDataTypeValueInvalid)) {
13201                                    UnallocatedT32(instr);
13202                                    return;
13203                                  }
13204                                  Alignment align =
13205                                      Align_align_1_Decode((instr >> 4) & 0x3);
13206                                  if (dt.Is(kDataTypeValueInvalid) ||
13207                                      align.Is(kBadAlignment)) {
13208                                    UnallocatedT32(instr);
13209                                    return;
13210                                  }
13211                                  unsigned first =
13212                                      ExtractDRegister(instr, 22, 12);
13213                                  unsigned length;
13214                                  SpacingType spacing = kSingle;
13215                                  switch ((instr >> 8) & 0xf) {
13216                                    default:
13217                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13218                                    case 0x7:
13219                                      length = 1;
13220                                      break;
13221                                    case 0xa:
13222                                      length = 2;
13223                                      break;
13224                                    case 0x6:
13225                                      length = 3;
13226                                      break;
13227                                    case 0x2:
13228                                      length = 4;
13229                                      break;
13230                                  }
13231                                  unsigned last = first + length - 1;
13232                                  TransferType transfer = kMultipleLanes;
13233                                  unsigned rn = (instr >> 16) & 0xf;
13234                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13235                                  vld1(CurrentCond(),
13236                                       dt,
13237                                       NeonRegisterList(DRegister(first),
13238                                                        DRegister(last),
13239                                                        spacing,
13240                                                        transfer),
13241                                       AlignedMemOperand(Register(rn),
13242                                                         align,
13243                                                         PostIndex));
13244                                  break;
13245                                }
13246                                case 0x00000300: {
13247                                  // 0xf920030d
13248                                  if (((instr & 0xe30) == 0x830)) {
13249                                    UnallocatedT32(instr);
13250                                    return;
13251                                  }
13252                                  DataType dt =
13253                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13254                                  if (dt.Is(kDataTypeValueInvalid)) {
13255                                    UnallocatedT32(instr);
13256                                    return;
13257                                  }
13258                                  Alignment align =
13259                                      Align_align_2_Decode((instr >> 4) & 0x3);
13260                                  if (dt.Is(kDataTypeValueInvalid) ||
13261                                      align.Is(kBadAlignment)) {
13262                                    UnallocatedT32(instr);
13263                                    return;
13264                                  }
13265                                  unsigned first =
13266                                      ExtractDRegister(instr, 22, 12);
13267                                  unsigned length;
13268                                  SpacingType spacing;
13269                                  switch ((instr >> 8) & 0xf) {
13270                                    default:
13271                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13272                                    case 0x8:
13273                                      length = 2;
13274                                      spacing = kSingle;
13275                                      break;
13276                                    case 0x9:
13277                                      length = 2;
13278                                      spacing = kDouble;
13279                                      break;
13280                                    case 0x3:
13281                                      length = 4;
13282                                      spacing = kSingle;
13283                                      break;
13284                                  }
13285                                  unsigned last =
13286                                      first +
13287                                      (length - 1) *
13288                                          (spacing == kSingle ? 1 : 2);
13289                                  TransferType transfer = kMultipleLanes;
13290                                  unsigned rn = (instr >> 16) & 0xf;
13291                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13292                                  vld2(CurrentCond(),
13293                                       dt,
13294                                       NeonRegisterList(DRegister(first),
13295                                                        DRegister(last),
13296                                                        spacing,
13297                                                        transfer),
13298                                       AlignedMemOperand(Register(rn),
13299                                                         align,
13300                                                         PostIndex));
13301                                  break;
13302                                }
13303                                case 0x00000400: {
13304                                  // 0xf920040d
13305                                  DataType dt =
13306                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13307                                  if (dt.Is(kDataTypeValueInvalid)) {
13308                                    UnallocatedT32(instr);
13309                                    return;
13310                                  }
13311                                  Alignment align =
13312                                      Align_align_3_Decode((instr >> 4) & 0x3);
13313                                  if (dt.Is(kDataTypeValueInvalid) ||
13314                                      align.Is(kBadAlignment)) {
13315                                    UnallocatedT32(instr);
13316                                    return;
13317                                  }
13318                                  unsigned first =
13319                                      ExtractDRegister(instr, 22, 12);
13320                                  unsigned length;
13321                                  SpacingType spacing;
13322                                  switch ((instr >> 8) & 0xf) {
13323                                    default:
13324                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13325                                    case 0x4:
13326                                      length = 3;
13327                                      spacing = kSingle;
13328                                      break;
13329                                    case 0x5:
13330                                      length = 3;
13331                                      spacing = kDouble;
13332                                      break;
13333                                  }
13334                                  unsigned last =
13335                                      first +
13336                                      (length - 1) *
13337                                          (spacing == kSingle ? 1 : 2);
13338                                  TransferType transfer = kMultipleLanes;
13339                                  unsigned rn = (instr >> 16) & 0xf;
13340                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13341                                  vld3(CurrentCond(),
13342                                       dt,
13343                                       NeonRegisterList(DRegister(first),
13344                                                        DRegister(last),
13345                                                        spacing,
13346                                                        transfer),
13347                                       AlignedMemOperand(Register(rn),
13348                                                         align,
13349                                                         PostIndex));
13350                                  break;
13351                                }
13352                                case 0x00000500: {
13353                                  // 0xf920050d
13354                                  DataType dt =
13355                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13356                                  if (dt.Is(kDataTypeValueInvalid)) {
13357                                    UnallocatedT32(instr);
13358                                    return;
13359                                  }
13360                                  Alignment align =
13361                                      Align_align_3_Decode((instr >> 4) & 0x3);
13362                                  if (dt.Is(kDataTypeValueInvalid) ||
13363                                      align.Is(kBadAlignment)) {
13364                                    UnallocatedT32(instr);
13365                                    return;
13366                                  }
13367                                  unsigned first =
13368                                      ExtractDRegister(instr, 22, 12);
13369                                  unsigned length;
13370                                  SpacingType spacing;
13371                                  switch ((instr >> 8) & 0xf) {
13372                                    default:
13373                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13374                                    case 0x4:
13375                                      length = 3;
13376                                      spacing = kSingle;
13377                                      break;
13378                                    case 0x5:
13379                                      length = 3;
13380                                      spacing = kDouble;
13381                                      break;
13382                                  }
13383                                  unsigned last =
13384                                      first +
13385                                      (length - 1) *
13386                                          (spacing == kSingle ? 1 : 2);
13387                                  TransferType transfer = kMultipleLanes;
13388                                  unsigned rn = (instr >> 16) & 0xf;
13389                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13390                                  vld3(CurrentCond(),
13391                                       dt,
13392                                       NeonRegisterList(DRegister(first),
13393                                                        DRegister(last),
13394                                                        spacing,
13395                                                        transfer),
13396                                       AlignedMemOperand(Register(rn),
13397                                                         align,
13398                                                         PostIndex));
13399                                  break;
13400                                }
13401                                case 0x00000600: {
13402                                  // 0xf920060d
13403                                  if (((instr & 0xe20) == 0x620) ||
13404                                      ((instr & 0xf30) == 0xa30)) {
13405                                    UnallocatedT32(instr);
13406                                    return;
13407                                  }
13408                                  DataType dt =
13409                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13410                                  if (dt.Is(kDataTypeValueInvalid)) {
13411                                    UnallocatedT32(instr);
13412                                    return;
13413                                  }
13414                                  Alignment align =
13415                                      Align_align_1_Decode((instr >> 4) & 0x3);
13416                                  if (dt.Is(kDataTypeValueInvalid) ||
13417                                      align.Is(kBadAlignment)) {
13418                                    UnallocatedT32(instr);
13419                                    return;
13420                                  }
13421                                  unsigned first =
13422                                      ExtractDRegister(instr, 22, 12);
13423                                  unsigned length;
13424                                  SpacingType spacing = kSingle;
13425                                  switch ((instr >> 8) & 0xf) {
13426                                    default:
13427                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13428                                    case 0x7:
13429                                      length = 1;
13430                                      break;
13431                                    case 0xa:
13432                                      length = 2;
13433                                      break;
13434                                    case 0x6:
13435                                      length = 3;
13436                                      break;
13437                                    case 0x2:
13438                                      length = 4;
13439                                      break;
13440                                  }
13441                                  unsigned last = first + length - 1;
13442                                  TransferType transfer = kMultipleLanes;
13443                                  unsigned rn = (instr >> 16) & 0xf;
13444                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13445                                  vld1(CurrentCond(),
13446                                       dt,
13447                                       NeonRegisterList(DRegister(first),
13448                                                        DRegister(last),
13449                                                        spacing,
13450                                                        transfer),
13451                                       AlignedMemOperand(Register(rn),
13452                                                         align,
13453                                                         PostIndex));
13454                                  break;
13455                                }
13456                                case 0x00000700: {
13457                                  // 0xf920070d
13458                                  if (((instr & 0xe20) == 0x620) ||
13459                                      ((instr & 0xf30) == 0xa30)) {
13460                                    UnallocatedT32(instr);
13461                                    return;
13462                                  }
13463                                  DataType dt =
13464                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13465                                  if (dt.Is(kDataTypeValueInvalid)) {
13466                                    UnallocatedT32(instr);
13467                                    return;
13468                                  }
13469                                  Alignment align =
13470                                      Align_align_1_Decode((instr >> 4) & 0x3);
13471                                  if (dt.Is(kDataTypeValueInvalid) ||
13472                                      align.Is(kBadAlignment)) {
13473                                    UnallocatedT32(instr);
13474                                    return;
13475                                  }
13476                                  unsigned first =
13477                                      ExtractDRegister(instr, 22, 12);
13478                                  unsigned length;
13479                                  SpacingType spacing = kSingle;
13480                                  switch ((instr >> 8) & 0xf) {
13481                                    default:
13482                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13483                                    case 0x7:
13484                                      length = 1;
13485                                      break;
13486                                    case 0xa:
13487                                      length = 2;
13488                                      break;
13489                                    case 0x6:
13490                                      length = 3;
13491                                      break;
13492                                    case 0x2:
13493                                      length = 4;
13494                                      break;
13495                                  }
13496                                  unsigned last = first + length - 1;
13497                                  TransferType transfer = kMultipleLanes;
13498                                  unsigned rn = (instr >> 16) & 0xf;
13499                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13500                                  vld1(CurrentCond(),
13501                                       dt,
13502                                       NeonRegisterList(DRegister(first),
13503                                                        DRegister(last),
13504                                                        spacing,
13505                                                        transfer),
13506                                       AlignedMemOperand(Register(rn),
13507                                                         align,
13508                                                         PostIndex));
13509                                  break;
13510                                }
13511                                case 0x00000800: {
13512                                  // 0xf920080d
13513                                  if (((instr & 0xe30) == 0x830)) {
13514                                    UnallocatedT32(instr);
13515                                    return;
13516                                  }
13517                                  DataType dt =
13518                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13519                                  if (dt.Is(kDataTypeValueInvalid)) {
13520                                    UnallocatedT32(instr);
13521                                    return;
13522                                  }
13523                                  Alignment align =
13524                                      Align_align_2_Decode((instr >> 4) & 0x3);
13525                                  if (dt.Is(kDataTypeValueInvalid) ||
13526                                      align.Is(kBadAlignment)) {
13527                                    UnallocatedT32(instr);
13528                                    return;
13529                                  }
13530                                  unsigned first =
13531                                      ExtractDRegister(instr, 22, 12);
13532                                  unsigned length;
13533                                  SpacingType spacing;
13534                                  switch ((instr >> 8) & 0xf) {
13535                                    default:
13536                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13537                                    case 0x8:
13538                                      length = 2;
13539                                      spacing = kSingle;
13540                                      break;
13541                                    case 0x9:
13542                                      length = 2;
13543                                      spacing = kDouble;
13544                                      break;
13545                                    case 0x3:
13546                                      length = 4;
13547                                      spacing = kSingle;
13548                                      break;
13549                                  }
13550                                  unsigned last =
13551                                      first +
13552                                      (length - 1) *
13553                                          (spacing == kSingle ? 1 : 2);
13554                                  TransferType transfer = kMultipleLanes;
13555                                  unsigned rn = (instr >> 16) & 0xf;
13556                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13557                                  vld2(CurrentCond(),
13558                                       dt,
13559                                       NeonRegisterList(DRegister(first),
13560                                                        DRegister(last),
13561                                                        spacing,
13562                                                        transfer),
13563                                       AlignedMemOperand(Register(rn),
13564                                                         align,
13565                                                         PostIndex));
13566                                  break;
13567                                }
13568                                case 0x00000900: {
13569                                  // 0xf920090d
13570                                  if (((instr & 0xe30) == 0x830)) {
13571                                    UnallocatedT32(instr);
13572                                    return;
13573                                  }
13574                                  DataType dt =
13575                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13576                                  if (dt.Is(kDataTypeValueInvalid)) {
13577                                    UnallocatedT32(instr);
13578                                    return;
13579                                  }
13580                                  Alignment align =
13581                                      Align_align_2_Decode((instr >> 4) & 0x3);
13582                                  if (dt.Is(kDataTypeValueInvalid) ||
13583                                      align.Is(kBadAlignment)) {
13584                                    UnallocatedT32(instr);
13585                                    return;
13586                                  }
13587                                  unsigned first =
13588                                      ExtractDRegister(instr, 22, 12);
13589                                  unsigned length;
13590                                  SpacingType spacing;
13591                                  switch ((instr >> 8) & 0xf) {
13592                                    default:
13593                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13594                                    case 0x8:
13595                                      length = 2;
13596                                      spacing = kSingle;
13597                                      break;
13598                                    case 0x9:
13599                                      length = 2;
13600                                      spacing = kDouble;
13601                                      break;
13602                                    case 0x3:
13603                                      length = 4;
13604                                      spacing = kSingle;
13605                                      break;
13606                                  }
13607                                  unsigned last =
13608                                      first +
13609                                      (length - 1) *
13610                                          (spacing == kSingle ? 1 : 2);
13611                                  TransferType transfer = kMultipleLanes;
13612                                  unsigned rn = (instr >> 16) & 0xf;
13613                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13614                                  vld2(CurrentCond(),
13615                                       dt,
13616                                       NeonRegisterList(DRegister(first),
13617                                                        DRegister(last),
13618                                                        spacing,
13619                                                        transfer),
13620                                       AlignedMemOperand(Register(rn),
13621                                                         align,
13622                                                         PostIndex));
13623                                  break;
13624                                }
13625                                case 0x00000a00: {
13626                                  // 0xf9200a0d
13627                                  if (((instr & 0xe20) == 0x620) ||
13628                                      ((instr & 0xf30) == 0xa30)) {
13629                                    UnallocatedT32(instr);
13630                                    return;
13631                                  }
13632                                  DataType dt =
13633                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13634                                  if (dt.Is(kDataTypeValueInvalid)) {
13635                                    UnallocatedT32(instr);
13636                                    return;
13637                                  }
13638                                  Alignment align =
13639                                      Align_align_1_Decode((instr >> 4) & 0x3);
13640                                  if (dt.Is(kDataTypeValueInvalid) ||
13641                                      align.Is(kBadAlignment)) {
13642                                    UnallocatedT32(instr);
13643                                    return;
13644                                  }
13645                                  unsigned first =
13646                                      ExtractDRegister(instr, 22, 12);
13647                                  unsigned length;
13648                                  SpacingType spacing = kSingle;
13649                                  switch ((instr >> 8) & 0xf) {
13650                                    default:
13651                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13652                                    case 0x7:
13653                                      length = 1;
13654                                      break;
13655                                    case 0xa:
13656                                      length = 2;
13657                                      break;
13658                                    case 0x6:
13659                                      length = 3;
13660                                      break;
13661                                    case 0x2:
13662                                      length = 4;
13663                                      break;
13664                                  }
13665                                  unsigned last = first + length - 1;
13666                                  TransferType transfer = kMultipleLanes;
13667                                  unsigned rn = (instr >> 16) & 0xf;
13668                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13669                                  vld1(CurrentCond(),
13670                                       dt,
13671                                       NeonRegisterList(DRegister(first),
13672                                                        DRegister(last),
13673                                                        spacing,
13674                                                        transfer),
13675                                       AlignedMemOperand(Register(rn),
13676                                                         align,
13677                                                         PostIndex));
13678                                  break;
13679                                }
13680                                default:
13681                                  UnallocatedT32(instr);
13682                                  break;
13683                              }
13684                              break;
13685                            }
13686                            case 0x00000002: {
13687                              // 0xf920000f
13688                              switch (instr & 0x00000f00) {
13689                                case 0x00000000: {
13690                                  // 0xf920000d
13691                                  DataType dt =
13692                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13693                                  if (dt.Is(kDataTypeValueInvalid)) {
13694                                    UnallocatedT32(instr);
13695                                    return;
13696                                  }
13697                                  Alignment align =
13698                                      Align_align_4_Decode((instr >> 4) & 0x3);
13699                                  if (dt.Is(kDataTypeValueInvalid) ||
13700                                      align.Is(kBadAlignment)) {
13701                                    UnallocatedT32(instr);
13702                                    return;
13703                                  }
13704                                  unsigned first =
13705                                      ExtractDRegister(instr, 22, 12);
13706                                  unsigned length;
13707                                  SpacingType spacing;
13708                                  switch ((instr >> 8) & 0xf) {
13709                                    default:
13710                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13711                                    case 0x0:
13712                                      length = 4;
13713                                      spacing = kSingle;
13714                                      break;
13715                                    case 0x1:
13716                                      length = 4;
13717                                      spacing = kDouble;
13718                                      break;
13719                                  }
13720                                  unsigned last =
13721                                      first +
13722                                      (length - 1) *
13723                                          (spacing == kSingle ? 1 : 2);
13724                                  TransferType transfer = kMultipleLanes;
13725                                  unsigned rn = (instr >> 16) & 0xf;
13726                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13727                                  vld4(CurrentCond(),
13728                                       dt,
13729                                       NeonRegisterList(DRegister(first),
13730                                                        DRegister(last),
13731                                                        spacing,
13732                                                        transfer),
13733                                       AlignedMemOperand(Register(rn),
13734                                                         align,
13735                                                         Offset));
13736                                  break;
13737                                }
13738                                case 0x00000100: {
13739                                  // 0xf920010d
13740                                  DataType dt =
13741                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13742                                  if (dt.Is(kDataTypeValueInvalid)) {
13743                                    UnallocatedT32(instr);
13744                                    return;
13745                                  }
13746                                  Alignment align =
13747                                      Align_align_4_Decode((instr >> 4) & 0x3);
13748                                  if (dt.Is(kDataTypeValueInvalid) ||
13749                                      align.Is(kBadAlignment)) {
13750                                    UnallocatedT32(instr);
13751                                    return;
13752                                  }
13753                                  unsigned first =
13754                                      ExtractDRegister(instr, 22, 12);
13755                                  unsigned length;
13756                                  SpacingType spacing;
13757                                  switch ((instr >> 8) & 0xf) {
13758                                    default:
13759                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13760                                    case 0x0:
13761                                      length = 4;
13762                                      spacing = kSingle;
13763                                      break;
13764                                    case 0x1:
13765                                      length = 4;
13766                                      spacing = kDouble;
13767                                      break;
13768                                  }
13769                                  unsigned last =
13770                                      first +
13771                                      (length - 1) *
13772                                          (spacing == kSingle ? 1 : 2);
13773                                  TransferType transfer = kMultipleLanes;
13774                                  unsigned rn = (instr >> 16) & 0xf;
13775                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13776                                  vld4(CurrentCond(),
13777                                       dt,
13778                                       NeonRegisterList(DRegister(first),
13779                                                        DRegister(last),
13780                                                        spacing,
13781                                                        transfer),
13782                                       AlignedMemOperand(Register(rn),
13783                                                         align,
13784                                                         Offset));
13785                                  break;
13786                                }
13787                                case 0x00000200: {
13788                                  // 0xf920020d
13789                                  if (((instr & 0xe20) == 0x620) ||
13790                                      ((instr & 0xf30) == 0xa30)) {
13791                                    UnallocatedT32(instr);
13792                                    return;
13793                                  }
13794                                  DataType dt =
13795                                      Dt_size_6_Decode((instr >> 6) & 0x3);
13796                                  if (dt.Is(kDataTypeValueInvalid)) {
13797                                    UnallocatedT32(instr);
13798                                    return;
13799                                  }
13800                                  Alignment align =
13801                                      Align_align_1_Decode((instr >> 4) & 0x3);
13802                                  if (dt.Is(kDataTypeValueInvalid) ||
13803                                      align.Is(kBadAlignment)) {
13804                                    UnallocatedT32(instr);
13805                                    return;
13806                                  }
13807                                  unsigned first =
13808                                      ExtractDRegister(instr, 22, 12);
13809                                  unsigned length;
13810                                  SpacingType spacing = kSingle;
13811                                  switch ((instr >> 8) & 0xf) {
13812                                    default:
13813                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13814                                    case 0x7:
13815                                      length = 1;
13816                                      break;
13817                                    case 0xa:
13818                                      length = 2;
13819                                      break;
13820                                    case 0x6:
13821                                      length = 3;
13822                                      break;
13823                                    case 0x2:
13824                                      length = 4;
13825                                      break;
13826                                  }
13827                                  unsigned last = first + length - 1;
13828                                  TransferType transfer = kMultipleLanes;
13829                                  unsigned rn = (instr >> 16) & 0xf;
13830                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13831                                  vld1(CurrentCond(),
13832                                       dt,
13833                                       NeonRegisterList(DRegister(first),
13834                                                        DRegister(last),
13835                                                        spacing,
13836                                                        transfer),
13837                                       AlignedMemOperand(Register(rn),
13838                                                         align,
13839                                                         Offset));
13840                                  break;
13841                                }
13842                                case 0x00000300: {
13843                                  // 0xf920030d
13844                                  if (((instr & 0xe30) == 0x830)) {
13845                                    UnallocatedT32(instr);
13846                                    return;
13847                                  }
13848                                  DataType dt =
13849                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13850                                  if (dt.Is(kDataTypeValueInvalid)) {
13851                                    UnallocatedT32(instr);
13852                                    return;
13853                                  }
13854                                  Alignment align =
13855                                      Align_align_2_Decode((instr >> 4) & 0x3);
13856                                  if (dt.Is(kDataTypeValueInvalid) ||
13857                                      align.Is(kBadAlignment)) {
13858                                    UnallocatedT32(instr);
13859                                    return;
13860                                  }
13861                                  unsigned first =
13862                                      ExtractDRegister(instr, 22, 12);
13863                                  unsigned length;
13864                                  SpacingType spacing;
13865                                  switch ((instr >> 8) & 0xf) {
13866                                    default:
13867                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13868                                    case 0x8:
13869                                      length = 2;
13870                                      spacing = kSingle;
13871                                      break;
13872                                    case 0x9:
13873                                      length = 2;
13874                                      spacing = kDouble;
13875                                      break;
13876                                    case 0x3:
13877                                      length = 4;
13878                                      spacing = kSingle;
13879                                      break;
13880                                  }
13881                                  unsigned last =
13882                                      first +
13883                                      (length - 1) *
13884                                          (spacing == kSingle ? 1 : 2);
13885                                  TransferType transfer = kMultipleLanes;
13886                                  unsigned rn = (instr >> 16) & 0xf;
13887                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13888                                  vld2(CurrentCond(),
13889                                       dt,
13890                                       NeonRegisterList(DRegister(first),
13891                                                        DRegister(last),
13892                                                        spacing,
13893                                                        transfer),
13894                                       AlignedMemOperand(Register(rn),
13895                                                         align,
13896                                                         Offset));
13897                                  break;
13898                                }
13899                                case 0x00000400: {
13900                                  // 0xf920040d
13901                                  DataType dt =
13902                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13903                                  if (dt.Is(kDataTypeValueInvalid)) {
13904                                    UnallocatedT32(instr);
13905                                    return;
13906                                  }
13907                                  Alignment align =
13908                                      Align_align_3_Decode((instr >> 4) & 0x3);
13909                                  if (dt.Is(kDataTypeValueInvalid) ||
13910                                      align.Is(kBadAlignment)) {
13911                                    UnallocatedT32(instr);
13912                                    return;
13913                                  }
13914                                  unsigned first =
13915                                      ExtractDRegister(instr, 22, 12);
13916                                  unsigned length;
13917                                  SpacingType spacing;
13918                                  switch ((instr >> 8) & 0xf) {
13919                                    default:
13920                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13921                                    case 0x4:
13922                                      length = 3;
13923                                      spacing = kSingle;
13924                                      break;
13925                                    case 0x5:
13926                                      length = 3;
13927                                      spacing = kDouble;
13928                                      break;
13929                                  }
13930                                  unsigned last =
13931                                      first +
13932                                      (length - 1) *
13933                                          (spacing == kSingle ? 1 : 2);
13934                                  TransferType transfer = kMultipleLanes;
13935                                  unsigned rn = (instr >> 16) & 0xf;
13936                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13937                                  vld3(CurrentCond(),
13938                                       dt,
13939                                       NeonRegisterList(DRegister(first),
13940                                                        DRegister(last),
13941                                                        spacing,
13942                                                        transfer),
13943                                       AlignedMemOperand(Register(rn),
13944                                                         align,
13945                                                         Offset));
13946                                  break;
13947                                }
13948                                case 0x00000500: {
13949                                  // 0xf920050d
13950                                  DataType dt =
13951                                      Dt_size_7_Decode((instr >> 6) & 0x3);
13952                                  if (dt.Is(kDataTypeValueInvalid)) {
13953                                    UnallocatedT32(instr);
13954                                    return;
13955                                  }
13956                                  Alignment align =
13957                                      Align_align_3_Decode((instr >> 4) & 0x3);
13958                                  if (dt.Is(kDataTypeValueInvalid) ||
13959                                      align.Is(kBadAlignment)) {
13960                                    UnallocatedT32(instr);
13961                                    return;
13962                                  }
13963                                  unsigned first =
13964                                      ExtractDRegister(instr, 22, 12);
13965                                  unsigned length;
13966                                  SpacingType spacing;
13967                                  switch ((instr >> 8) & 0xf) {
13968                                    default:
13969                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
13970                                    case 0x4:
13971                                      length = 3;
13972                                      spacing = kSingle;
13973                                      break;
13974                                    case 0x5:
13975                                      length = 3;
13976                                      spacing = kDouble;
13977                                      break;
13978                                  }
13979                                  unsigned last =
13980                                      first +
13981                                      (length - 1) *
13982                                          (spacing == kSingle ? 1 : 2);
13983                                  TransferType transfer = kMultipleLanes;
13984                                  unsigned rn = (instr >> 16) & 0xf;
13985                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13986                                  vld3(CurrentCond(),
13987                                       dt,
13988                                       NeonRegisterList(DRegister(first),
13989                                                        DRegister(last),
13990                                                        spacing,
13991                                                        transfer),
13992                                       AlignedMemOperand(Register(rn),
13993                                                         align,
13994                                                         Offset));
13995                                  break;
13996                                }
13997                                case 0x00000600: {
13998                                  // 0xf920060d
13999                                  if (((instr & 0xe20) == 0x620) ||
14000                                      ((instr & 0xf30) == 0xa30)) {
14001                                    UnallocatedT32(instr);
14002                                    return;
14003                                  }
14004                                  DataType dt =
14005                                      Dt_size_6_Decode((instr >> 6) & 0x3);
14006                                  if (dt.Is(kDataTypeValueInvalid)) {
14007                                    UnallocatedT32(instr);
14008                                    return;
14009                                  }
14010                                  Alignment align =
14011                                      Align_align_1_Decode((instr >> 4) & 0x3);
14012                                  if (dt.Is(kDataTypeValueInvalid) ||
14013                                      align.Is(kBadAlignment)) {
14014                                    UnallocatedT32(instr);
14015                                    return;
14016                                  }
14017                                  unsigned first =
14018                                      ExtractDRegister(instr, 22, 12);
14019                                  unsigned length;
14020                                  SpacingType spacing = kSingle;
14021                                  switch ((instr >> 8) & 0xf) {
14022                                    default:
14023                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14024                                    case 0x7:
14025                                      length = 1;
14026                                      break;
14027                                    case 0xa:
14028                                      length = 2;
14029                                      break;
14030                                    case 0x6:
14031                                      length = 3;
14032                                      break;
14033                                    case 0x2:
14034                                      length = 4;
14035                                      break;
14036                                  }
14037                                  unsigned last = first + length - 1;
14038                                  TransferType transfer = kMultipleLanes;
14039                                  unsigned rn = (instr >> 16) & 0xf;
14040                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14041                                  vld1(CurrentCond(),
14042                                       dt,
14043                                       NeonRegisterList(DRegister(first),
14044                                                        DRegister(last),
14045                                                        spacing,
14046                                                        transfer),
14047                                       AlignedMemOperand(Register(rn),
14048                                                         align,
14049                                                         Offset));
14050                                  break;
14051                                }
14052                                case 0x00000700: {
14053                                  // 0xf920070d
14054                                  if (((instr & 0xe20) == 0x620) ||
14055                                      ((instr & 0xf30) == 0xa30)) {
14056                                    UnallocatedT32(instr);
14057                                    return;
14058                                  }
14059                                  DataType dt =
14060                                      Dt_size_6_Decode((instr >> 6) & 0x3);
14061                                  if (dt.Is(kDataTypeValueInvalid)) {
14062                                    UnallocatedT32(instr);
14063                                    return;
14064                                  }
14065                                  Alignment align =
14066                                      Align_align_1_Decode((instr >> 4) & 0x3);
14067                                  if (dt.Is(kDataTypeValueInvalid) ||
14068                                      align.Is(kBadAlignment)) {
14069                                    UnallocatedT32(instr);
14070                                    return;
14071                                  }
14072                                  unsigned first =
14073                                      ExtractDRegister(instr, 22, 12);
14074                                  unsigned length;
14075                                  SpacingType spacing = kSingle;
14076                                  switch ((instr >> 8) & 0xf) {
14077                                    default:
14078                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14079                                    case 0x7:
14080                                      length = 1;
14081                                      break;
14082                                    case 0xa:
14083                                      length = 2;
14084                                      break;
14085                                    case 0x6:
14086                                      length = 3;
14087                                      break;
14088                                    case 0x2:
14089                                      length = 4;
14090                                      break;
14091                                  }
14092                                  unsigned last = first + length - 1;
14093                                  TransferType transfer = kMultipleLanes;
14094                                  unsigned rn = (instr >> 16) & 0xf;
14095                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14096                                  vld1(CurrentCond(),
14097                                       dt,
14098                                       NeonRegisterList(DRegister(first),
14099                                                        DRegister(last),
14100                                                        spacing,
14101                                                        transfer),
14102                                       AlignedMemOperand(Register(rn),
14103                                                         align,
14104                                                         Offset));
14105                                  break;
14106                                }
14107                                case 0x00000800: {
14108                                  // 0xf920080d
14109                                  if (((instr & 0xe30) == 0x830)) {
14110                                    UnallocatedT32(instr);
14111                                    return;
14112                                  }
14113                                  DataType dt =
14114                                      Dt_size_7_Decode((instr >> 6) & 0x3);
14115                                  if (dt.Is(kDataTypeValueInvalid)) {
14116                                    UnallocatedT32(instr);
14117                                    return;
14118                                  }
14119                                  Alignment align =
14120                                      Align_align_2_Decode((instr >> 4) & 0x3);
14121                                  if (dt.Is(kDataTypeValueInvalid) ||
14122                                      align.Is(kBadAlignment)) {
14123                                    UnallocatedT32(instr);
14124                                    return;
14125                                  }
14126                                  unsigned first =
14127                                      ExtractDRegister(instr, 22, 12);
14128                                  unsigned length;
14129                                  SpacingType spacing;
14130                                  switch ((instr >> 8) & 0xf) {
14131                                    default:
14132                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14133                                    case 0x8:
14134                                      length = 2;
14135                                      spacing = kSingle;
14136                                      break;
14137                                    case 0x9:
14138                                      length = 2;
14139                                      spacing = kDouble;
14140                                      break;
14141                                    case 0x3:
14142                                      length = 4;
14143                                      spacing = kSingle;
14144                                      break;
14145                                  }
14146                                  unsigned last =
14147                                      first +
14148                                      (length - 1) *
14149                                          (spacing == kSingle ? 1 : 2);
14150                                  TransferType transfer = kMultipleLanes;
14151                                  unsigned rn = (instr >> 16) & 0xf;
14152                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14153                                  vld2(CurrentCond(),
14154                                       dt,
14155                                       NeonRegisterList(DRegister(first),
14156                                                        DRegister(last),
14157                                                        spacing,
14158                                                        transfer),
14159                                       AlignedMemOperand(Register(rn),
14160                                                         align,
14161                                                         Offset));
14162                                  break;
14163                                }
14164                                case 0x00000900: {
14165                                  // 0xf920090d
14166                                  if (((instr & 0xe30) == 0x830)) {
14167                                    UnallocatedT32(instr);
14168                                    return;
14169                                  }
14170                                  DataType dt =
14171                                      Dt_size_7_Decode((instr >> 6) & 0x3);
14172                                  if (dt.Is(kDataTypeValueInvalid)) {
14173                                    UnallocatedT32(instr);
14174                                    return;
14175                                  }
14176                                  Alignment align =
14177                                      Align_align_2_Decode((instr >> 4) & 0x3);
14178                                  if (dt.Is(kDataTypeValueInvalid) ||
14179                                      align.Is(kBadAlignment)) {
14180                                    UnallocatedT32(instr);
14181                                    return;
14182                                  }
14183                                  unsigned first =
14184                                      ExtractDRegister(instr, 22, 12);
14185                                  unsigned length;
14186                                  SpacingType spacing;
14187                                  switch ((instr >> 8) & 0xf) {
14188                                    default:
14189                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14190                                    case 0x8:
14191                                      length = 2;
14192                                      spacing = kSingle;
14193                                      break;
14194                                    case 0x9:
14195                                      length = 2;
14196                                      spacing = kDouble;
14197                                      break;
14198                                    case 0x3:
14199                                      length = 4;
14200                                      spacing = kSingle;
14201                                      break;
14202                                  }
14203                                  unsigned last =
14204                                      first +
14205                                      (length - 1) *
14206                                          (spacing == kSingle ? 1 : 2);
14207                                  TransferType transfer = kMultipleLanes;
14208                                  unsigned rn = (instr >> 16) & 0xf;
14209                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14210                                  vld2(CurrentCond(),
14211                                       dt,
14212                                       NeonRegisterList(DRegister(first),
14213                                                        DRegister(last),
14214                                                        spacing,
14215                                                        transfer),
14216                                       AlignedMemOperand(Register(rn),
14217                                                         align,
14218                                                         Offset));
14219                                  break;
14220                                }
14221                                case 0x00000a00: {
14222                                  // 0xf9200a0d
14223                                  if (((instr & 0xe20) == 0x620) ||
14224                                      ((instr & 0xf30) == 0xa30)) {
14225                                    UnallocatedT32(instr);
14226                                    return;
14227                                  }
14228                                  DataType dt =
14229                                      Dt_size_6_Decode((instr >> 6) & 0x3);
14230                                  if (dt.Is(kDataTypeValueInvalid)) {
14231                                    UnallocatedT32(instr);
14232                                    return;
14233                                  }
14234                                  Alignment align =
14235                                      Align_align_1_Decode((instr >> 4) & 0x3);
14236                                  if (dt.Is(kDataTypeValueInvalid) ||
14237                                      align.Is(kBadAlignment)) {
14238                                    UnallocatedT32(instr);
14239                                    return;
14240                                  }
14241                                  unsigned first =
14242                                      ExtractDRegister(instr, 22, 12);
14243                                  unsigned length;
14244                                  SpacingType spacing = kSingle;
14245                                  switch ((instr >> 8) & 0xf) {
14246                                    default:
14247                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
14248                                    case 0x7:
14249                                      length = 1;
14250                                      break;
14251                                    case 0xa:
14252                                      length = 2;
14253                                      break;
14254                                    case 0x6:
14255                                      length = 3;
14256                                      break;
14257                                    case 0x2:
14258                                      length = 4;
14259                                      break;
14260                                  }
14261                                  unsigned last = first + length - 1;
14262                                  TransferType transfer = kMultipleLanes;
14263                                  unsigned rn = (instr >> 16) & 0xf;
14264                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14265                                  vld1(CurrentCond(),
14266                                       dt,
14267                                       NeonRegisterList(DRegister(first),
14268                                                        DRegister(last),
14269                                                        spacing,
14270                                                        transfer),
14271                                       AlignedMemOperand(Register(rn),
14272                                                         align,
14273                                                         Offset));
14274                                  break;
14275                                }
14276                                default:
14277                                  UnallocatedT32(instr);
14278                                  break;
14279                              }
14280                              break;
14281                            }
14282                          }
14283                          break;
14284                        }
14285                        default: {
14286                          switch (instr & 0x00000f00) {
14287                            case 0x00000000: {
14288                              // 0xf9200000
14289                              if (((instr & 0xd) == 0xd)) {
14290                                UnallocatedT32(instr);
14291                                return;
14292                              }
14293                              DataType dt =
14294                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14295                              if (dt.Is(kDataTypeValueInvalid)) {
14296                                UnallocatedT32(instr);
14297                                return;
14298                              }
14299                              Alignment align =
14300                                  Align_align_4_Decode((instr >> 4) & 0x3);
14301                              if (dt.Is(kDataTypeValueInvalid) ||
14302                                  align.Is(kBadAlignment)) {
14303                                UnallocatedT32(instr);
14304                                return;
14305                              }
14306                              unsigned first = ExtractDRegister(instr, 22, 12);
14307                              unsigned length;
14308                              SpacingType spacing;
14309                              switch ((instr >> 8) & 0xf) {
14310                                default:
14311                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14312                                case 0x0:
14313                                  length = 4;
14314                                  spacing = kSingle;
14315                                  break;
14316                                case 0x1:
14317                                  length = 4;
14318                                  spacing = kDouble;
14319                                  break;
14320                              }
14321                              unsigned last =
14322                                  first +
14323                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14324                              TransferType transfer = kMultipleLanes;
14325                              unsigned rn = (instr >> 16) & 0xf;
14326                              unsigned rm = instr & 0xf;
14327                              // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14328                              vld4(CurrentCond(),
14329                                   dt,
14330                                   NeonRegisterList(DRegister(first),
14331                                                    DRegister(last),
14332                                                    spacing,
14333                                                    transfer),
14334                                   AlignedMemOperand(Register(rn),
14335                                                     align,
14336                                                     Register(rm),
14337                                                     PostIndex));
14338                              break;
14339                            }
14340                            case 0x00000100: {
14341                              // 0xf9200100
14342                              if (((instr & 0xd) == 0xd)) {
14343                                UnallocatedT32(instr);
14344                                return;
14345                              }
14346                              DataType dt =
14347                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14348                              if (dt.Is(kDataTypeValueInvalid)) {
14349                                UnallocatedT32(instr);
14350                                return;
14351                              }
14352                              Alignment align =
14353                                  Align_align_4_Decode((instr >> 4) & 0x3);
14354                              if (dt.Is(kDataTypeValueInvalid) ||
14355                                  align.Is(kBadAlignment)) {
14356                                UnallocatedT32(instr);
14357                                return;
14358                              }
14359                              unsigned first = ExtractDRegister(instr, 22, 12);
14360                              unsigned length;
14361                              SpacingType spacing;
14362                              switch ((instr >> 8) & 0xf) {
14363                                default:
14364                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14365                                case 0x0:
14366                                  length = 4;
14367                                  spacing = kSingle;
14368                                  break;
14369                                case 0x1:
14370                                  length = 4;
14371                                  spacing = kDouble;
14372                                  break;
14373                              }
14374                              unsigned last =
14375                                  first +
14376                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14377                              TransferType transfer = kMultipleLanes;
14378                              unsigned rn = (instr >> 16) & 0xf;
14379                              unsigned rm = instr & 0xf;
14380                              // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14381                              vld4(CurrentCond(),
14382                                   dt,
14383                                   NeonRegisterList(DRegister(first),
14384                                                    DRegister(last),
14385                                                    spacing,
14386                                                    transfer),
14387                                   AlignedMemOperand(Register(rn),
14388                                                     align,
14389                                                     Register(rm),
14390                                                     PostIndex));
14391                              break;
14392                            }
14393                            case 0x00000200: {
14394                              // 0xf9200200
14395                              if (((instr & 0xd) == 0xd) ||
14396                                  ((instr & 0xe20) == 0x620) ||
14397                                  ((instr & 0xf30) == 0xa30)) {
14398                                UnallocatedT32(instr);
14399                                return;
14400                              }
14401                              DataType dt =
14402                                  Dt_size_6_Decode((instr >> 6) & 0x3);
14403                              if (dt.Is(kDataTypeValueInvalid)) {
14404                                UnallocatedT32(instr);
14405                                return;
14406                              }
14407                              Alignment align =
14408                                  Align_align_1_Decode((instr >> 4) & 0x3);
14409                              if (dt.Is(kDataTypeValueInvalid) ||
14410                                  align.Is(kBadAlignment)) {
14411                                UnallocatedT32(instr);
14412                                return;
14413                              }
14414                              unsigned first = ExtractDRegister(instr, 22, 12);
14415                              unsigned length;
14416                              SpacingType spacing = kSingle;
14417                              switch ((instr >> 8) & 0xf) {
14418                                default:
14419                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14420                                case 0x7:
14421                                  length = 1;
14422                                  break;
14423                                case 0xa:
14424                                  length = 2;
14425                                  break;
14426                                case 0x6:
14427                                  length = 3;
14428                                  break;
14429                                case 0x2:
14430                                  length = 4;
14431                                  break;
14432                              }
14433                              unsigned last = first + length - 1;
14434                              TransferType transfer = kMultipleLanes;
14435                              unsigned rn = (instr >> 16) & 0xf;
14436                              unsigned rm = instr & 0xf;
14437                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14438                              vld1(CurrentCond(),
14439                                   dt,
14440                                   NeonRegisterList(DRegister(first),
14441                                                    DRegister(last),
14442                                                    spacing,
14443                                                    transfer),
14444                                   AlignedMemOperand(Register(rn),
14445                                                     align,
14446                                                     Register(rm),
14447                                                     PostIndex));
14448                              break;
14449                            }
14450                            case 0x00000300: {
14451                              // 0xf9200300
14452                              if (((instr & 0xd) == 0xd) ||
14453                                  ((instr & 0xe30) == 0x830)) {
14454                                UnallocatedT32(instr);
14455                                return;
14456                              }
14457                              DataType dt =
14458                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14459                              if (dt.Is(kDataTypeValueInvalid)) {
14460                                UnallocatedT32(instr);
14461                                return;
14462                              }
14463                              Alignment align =
14464                                  Align_align_2_Decode((instr >> 4) & 0x3);
14465                              if (dt.Is(kDataTypeValueInvalid) ||
14466                                  align.Is(kBadAlignment)) {
14467                                UnallocatedT32(instr);
14468                                return;
14469                              }
14470                              unsigned first = ExtractDRegister(instr, 22, 12);
14471                              unsigned length;
14472                              SpacingType spacing;
14473                              switch ((instr >> 8) & 0xf) {
14474                                default:
14475                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14476                                case 0x8:
14477                                  length = 2;
14478                                  spacing = kSingle;
14479                                  break;
14480                                case 0x9:
14481                                  length = 2;
14482                                  spacing = kDouble;
14483                                  break;
14484                                case 0x3:
14485                                  length = 4;
14486                                  spacing = kSingle;
14487                                  break;
14488                              }
14489                              unsigned last =
14490                                  first +
14491                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14492                              TransferType transfer = kMultipleLanes;
14493                              unsigned rn = (instr >> 16) & 0xf;
14494                              unsigned rm = instr & 0xf;
14495                              // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14496                              vld2(CurrentCond(),
14497                                   dt,
14498                                   NeonRegisterList(DRegister(first),
14499                                                    DRegister(last),
14500                                                    spacing,
14501                                                    transfer),
14502                                   AlignedMemOperand(Register(rn),
14503                                                     align,
14504                                                     Register(rm),
14505                                                     PostIndex));
14506                              break;
14507                            }
14508                            case 0x00000400: {
14509                              // 0xf9200400
14510                              if (((instr & 0xd) == 0xd)) {
14511                                UnallocatedT32(instr);
14512                                return;
14513                              }
14514                              DataType dt =
14515                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14516                              if (dt.Is(kDataTypeValueInvalid)) {
14517                                UnallocatedT32(instr);
14518                                return;
14519                              }
14520                              Alignment align =
14521                                  Align_align_3_Decode((instr >> 4) & 0x3);
14522                              if (dt.Is(kDataTypeValueInvalid) ||
14523                                  align.Is(kBadAlignment)) {
14524                                UnallocatedT32(instr);
14525                                return;
14526                              }
14527                              unsigned first = ExtractDRegister(instr, 22, 12);
14528                              unsigned length;
14529                              SpacingType spacing;
14530                              switch ((instr >> 8) & 0xf) {
14531                                default:
14532                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14533                                case 0x4:
14534                                  length = 3;
14535                                  spacing = kSingle;
14536                                  break;
14537                                case 0x5:
14538                                  length = 3;
14539                                  spacing = kDouble;
14540                                  break;
14541                              }
14542                              unsigned last =
14543                                  first +
14544                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14545                              TransferType transfer = kMultipleLanes;
14546                              unsigned rn = (instr >> 16) & 0xf;
14547                              unsigned rm = instr & 0xf;
14548                              // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14549                              vld3(CurrentCond(),
14550                                   dt,
14551                                   NeonRegisterList(DRegister(first),
14552                                                    DRegister(last),
14553                                                    spacing,
14554                                                    transfer),
14555                                   AlignedMemOperand(Register(rn),
14556                                                     align,
14557                                                     Register(rm),
14558                                                     PostIndex));
14559                              break;
14560                            }
14561                            case 0x00000500: {
14562                              // 0xf9200500
14563                              if (((instr & 0xd) == 0xd)) {
14564                                UnallocatedT32(instr);
14565                                return;
14566                              }
14567                              DataType dt =
14568                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14569                              if (dt.Is(kDataTypeValueInvalid)) {
14570                                UnallocatedT32(instr);
14571                                return;
14572                              }
14573                              Alignment align =
14574                                  Align_align_3_Decode((instr >> 4) & 0x3);
14575                              if (dt.Is(kDataTypeValueInvalid) ||
14576                                  align.Is(kBadAlignment)) {
14577                                UnallocatedT32(instr);
14578                                return;
14579                              }
14580                              unsigned first = ExtractDRegister(instr, 22, 12);
14581                              unsigned length;
14582                              SpacingType spacing;
14583                              switch ((instr >> 8) & 0xf) {
14584                                default:
14585                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14586                                case 0x4:
14587                                  length = 3;
14588                                  spacing = kSingle;
14589                                  break;
14590                                case 0x5:
14591                                  length = 3;
14592                                  spacing = kDouble;
14593                                  break;
14594                              }
14595                              unsigned last =
14596                                  first +
14597                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14598                              TransferType transfer = kMultipleLanes;
14599                              unsigned rn = (instr >> 16) & 0xf;
14600                              unsigned rm = instr & 0xf;
14601                              // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14602                              vld3(CurrentCond(),
14603                                   dt,
14604                                   NeonRegisterList(DRegister(first),
14605                                                    DRegister(last),
14606                                                    spacing,
14607                                                    transfer),
14608                                   AlignedMemOperand(Register(rn),
14609                                                     align,
14610                                                     Register(rm),
14611                                                     PostIndex));
14612                              break;
14613                            }
14614                            case 0x00000600: {
14615                              // 0xf9200600
14616                              if (((instr & 0xd) == 0xd) ||
14617                                  ((instr & 0xe20) == 0x620) ||
14618                                  ((instr & 0xf30) == 0xa30)) {
14619                                UnallocatedT32(instr);
14620                                return;
14621                              }
14622                              DataType dt =
14623                                  Dt_size_6_Decode((instr >> 6) & 0x3);
14624                              if (dt.Is(kDataTypeValueInvalid)) {
14625                                UnallocatedT32(instr);
14626                                return;
14627                              }
14628                              Alignment align =
14629                                  Align_align_1_Decode((instr >> 4) & 0x3);
14630                              if (dt.Is(kDataTypeValueInvalid) ||
14631                                  align.Is(kBadAlignment)) {
14632                                UnallocatedT32(instr);
14633                                return;
14634                              }
14635                              unsigned first = ExtractDRegister(instr, 22, 12);
14636                              unsigned length;
14637                              SpacingType spacing = kSingle;
14638                              switch ((instr >> 8) & 0xf) {
14639                                default:
14640                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14641                                case 0x7:
14642                                  length = 1;
14643                                  break;
14644                                case 0xa:
14645                                  length = 2;
14646                                  break;
14647                                case 0x6:
14648                                  length = 3;
14649                                  break;
14650                                case 0x2:
14651                                  length = 4;
14652                                  break;
14653                              }
14654                              unsigned last = first + length - 1;
14655                              TransferType transfer = kMultipleLanes;
14656                              unsigned rn = (instr >> 16) & 0xf;
14657                              unsigned rm = instr & 0xf;
14658                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14659                              vld1(CurrentCond(),
14660                                   dt,
14661                                   NeonRegisterList(DRegister(first),
14662                                                    DRegister(last),
14663                                                    spacing,
14664                                                    transfer),
14665                                   AlignedMemOperand(Register(rn),
14666                                                     align,
14667                                                     Register(rm),
14668                                                     PostIndex));
14669                              break;
14670                            }
14671                            case 0x00000700: {
14672                              // 0xf9200700
14673                              if (((instr & 0xd) == 0xd) ||
14674                                  ((instr & 0xe20) == 0x620) ||
14675                                  ((instr & 0xf30) == 0xa30)) {
14676                                UnallocatedT32(instr);
14677                                return;
14678                              }
14679                              DataType dt =
14680                                  Dt_size_6_Decode((instr >> 6) & 0x3);
14681                              if (dt.Is(kDataTypeValueInvalid)) {
14682                                UnallocatedT32(instr);
14683                                return;
14684                              }
14685                              Alignment align =
14686                                  Align_align_1_Decode((instr >> 4) & 0x3);
14687                              if (dt.Is(kDataTypeValueInvalid) ||
14688                                  align.Is(kBadAlignment)) {
14689                                UnallocatedT32(instr);
14690                                return;
14691                              }
14692                              unsigned first = ExtractDRegister(instr, 22, 12);
14693                              unsigned length;
14694                              SpacingType spacing = kSingle;
14695                              switch ((instr >> 8) & 0xf) {
14696                                default:
14697                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14698                                case 0x7:
14699                                  length = 1;
14700                                  break;
14701                                case 0xa:
14702                                  length = 2;
14703                                  break;
14704                                case 0x6:
14705                                  length = 3;
14706                                  break;
14707                                case 0x2:
14708                                  length = 4;
14709                                  break;
14710                              }
14711                              unsigned last = first + length - 1;
14712                              TransferType transfer = kMultipleLanes;
14713                              unsigned rn = (instr >> 16) & 0xf;
14714                              unsigned rm = instr & 0xf;
14715                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14716                              vld1(CurrentCond(),
14717                                   dt,
14718                                   NeonRegisterList(DRegister(first),
14719                                                    DRegister(last),
14720                                                    spacing,
14721                                                    transfer),
14722                                   AlignedMemOperand(Register(rn),
14723                                                     align,
14724                                                     Register(rm),
14725                                                     PostIndex));
14726                              break;
14727                            }
14728                            case 0x00000800: {
14729                              // 0xf9200800
14730                              if (((instr & 0xd) == 0xd) ||
14731                                  ((instr & 0xe30) == 0x830)) {
14732                                UnallocatedT32(instr);
14733                                return;
14734                              }
14735                              DataType dt =
14736                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14737                              if (dt.Is(kDataTypeValueInvalid)) {
14738                                UnallocatedT32(instr);
14739                                return;
14740                              }
14741                              Alignment align =
14742                                  Align_align_2_Decode((instr >> 4) & 0x3);
14743                              if (dt.Is(kDataTypeValueInvalid) ||
14744                                  align.Is(kBadAlignment)) {
14745                                UnallocatedT32(instr);
14746                                return;
14747                              }
14748                              unsigned first = ExtractDRegister(instr, 22, 12);
14749                              unsigned length;
14750                              SpacingType spacing;
14751                              switch ((instr >> 8) & 0xf) {
14752                                default:
14753                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14754                                case 0x8:
14755                                  length = 2;
14756                                  spacing = kSingle;
14757                                  break;
14758                                case 0x9:
14759                                  length = 2;
14760                                  spacing = kDouble;
14761                                  break;
14762                                case 0x3:
14763                                  length = 4;
14764                                  spacing = kSingle;
14765                                  break;
14766                              }
14767                              unsigned last =
14768                                  first +
14769                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14770                              TransferType transfer = kMultipleLanes;
14771                              unsigned rn = (instr >> 16) & 0xf;
14772                              unsigned rm = instr & 0xf;
14773                              // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14774                              vld2(CurrentCond(),
14775                                   dt,
14776                                   NeonRegisterList(DRegister(first),
14777                                                    DRegister(last),
14778                                                    spacing,
14779                                                    transfer),
14780                                   AlignedMemOperand(Register(rn),
14781                                                     align,
14782                                                     Register(rm),
14783                                                     PostIndex));
14784                              break;
14785                            }
14786                            case 0x00000900: {
14787                              // 0xf9200900
14788                              if (((instr & 0xd) == 0xd) ||
14789                                  ((instr & 0xe30) == 0x830)) {
14790                                UnallocatedT32(instr);
14791                                return;
14792                              }
14793                              DataType dt =
14794                                  Dt_size_7_Decode((instr >> 6) & 0x3);
14795                              if (dt.Is(kDataTypeValueInvalid)) {
14796                                UnallocatedT32(instr);
14797                                return;
14798                              }
14799                              Alignment align =
14800                                  Align_align_2_Decode((instr >> 4) & 0x3);
14801                              if (dt.Is(kDataTypeValueInvalid) ||
14802                                  align.Is(kBadAlignment)) {
14803                                UnallocatedT32(instr);
14804                                return;
14805                              }
14806                              unsigned first = ExtractDRegister(instr, 22, 12);
14807                              unsigned length;
14808                              SpacingType spacing;
14809                              switch ((instr >> 8) & 0xf) {
14810                                default:
14811                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14812                                case 0x8:
14813                                  length = 2;
14814                                  spacing = kSingle;
14815                                  break;
14816                                case 0x9:
14817                                  length = 2;
14818                                  spacing = kDouble;
14819                                  break;
14820                                case 0x3:
14821                                  length = 4;
14822                                  spacing = kSingle;
14823                                  break;
14824                              }
14825                              unsigned last =
14826                                  first +
14827                                  (length - 1) * (spacing == kSingle ? 1 : 2);
14828                              TransferType transfer = kMultipleLanes;
14829                              unsigned rn = (instr >> 16) & 0xf;
14830                              unsigned rm = instr & 0xf;
14831                              // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14832                              vld2(CurrentCond(),
14833                                   dt,
14834                                   NeonRegisterList(DRegister(first),
14835                                                    DRegister(last),
14836                                                    spacing,
14837                                                    transfer),
14838                                   AlignedMemOperand(Register(rn),
14839                                                     align,
14840                                                     Register(rm),
14841                                                     PostIndex));
14842                              break;
14843                            }
14844                            case 0x00000a00: {
14845                              // 0xf9200a00
14846                              if (((instr & 0xd) == 0xd) ||
14847                                  ((instr & 0xe20) == 0x620) ||
14848                                  ((instr & 0xf30) == 0xa30)) {
14849                                UnallocatedT32(instr);
14850                                return;
14851                              }
14852                              DataType dt =
14853                                  Dt_size_6_Decode((instr >> 6) & 0x3);
14854                              if (dt.Is(kDataTypeValueInvalid)) {
14855                                UnallocatedT32(instr);
14856                                return;
14857                              }
14858                              Alignment align =
14859                                  Align_align_1_Decode((instr >> 4) & 0x3);
14860                              if (dt.Is(kDataTypeValueInvalid) ||
14861                                  align.Is(kBadAlignment)) {
14862                                UnallocatedT32(instr);
14863                                return;
14864                              }
14865                              unsigned first = ExtractDRegister(instr, 22, 12);
14866                              unsigned length;
14867                              SpacingType spacing = kSingle;
14868                              switch ((instr >> 8) & 0xf) {
14869                                default:
14870                                  VIXL_UNREACHABLE_OR_FALLTHROUGH();
14871                                case 0x7:
14872                                  length = 1;
14873                                  break;
14874                                case 0xa:
14875                                  length = 2;
14876                                  break;
14877                                case 0x6:
14878                                  length = 3;
14879                                  break;
14880                                case 0x2:
14881                                  length = 4;
14882                                  break;
14883                              }
14884                              unsigned last = first + length - 1;
14885                              TransferType transfer = kMultipleLanes;
14886                              unsigned rn = (instr >> 16) & 0xf;
14887                              unsigned rm = instr & 0xf;
14888                              // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14889                              vld1(CurrentCond(),
14890                                   dt,
14891                                   NeonRegisterList(DRegister(first),
14892                                                    DRegister(last),
14893                                                    spacing,
14894                                                    transfer),
14895                                   AlignedMemOperand(Register(rn),
14896                                                     align,
14897                                                     Register(rm),
14898                                                     PostIndex));
14899                              break;
14900                            }
14901                            default:
14902                              UnallocatedT32(instr);
14903                              break;
14904                          }
14905                          break;
14906                        }
14907                      }
14908                      break;
14909                    }
14910                    case 0x01800000: {
14911                      // 0xf9800000
14912                      switch (instr & 0x00000300) {
14913                        case 0x00000000: {
14914                          // 0xf9800000
14915                          switch (instr & 0x00000c00) {
14916                            case 0x00000c00: {
14917                              // 0xf9800c00
14918                              UnallocatedT32(instr);
14919                              break;
14920                            }
14921                            default: {
14922                              switch (instr & 0x0000000d) {
14923                                case 0x0000000d: {
14924                                  // 0xf980000d
14925                                  switch (instr & 0x00000002) {
14926                                    case 0x00000000: {
14927                                      // 0xf980000d
14928                                      if (((instr & 0xc00) == 0xc00)) {
14929                                        UnallocatedT32(instr);
14930                                        return;
14931                                      }
14932                                      DataType dt =
14933                                          Dt_size_7_Decode((instr >> 10) & 0x3);
14934                                      if (dt.Is(kDataTypeValueInvalid)) {
14935                                        UnallocatedT32(instr);
14936                                        return;
14937                                      }
14938                                      DecodeNeonAndAlign decode_neon =
14939                                          Align_index_align_1_Decode((instr >>
14940                                                                      4) &
14941                                                                         0xf,
14942                                                                     dt);
14943                                      if (!decode_neon.IsValid()) {
14944                                        UnallocatedT32(instr);
14945                                        return;
14946                                      }
14947                                      Alignment align = decode_neon.GetAlign();
14948                                      int lane = decode_neon.GetLane();
14949                                      SpacingType spacing =
14950                                          decode_neon.GetSpacing();
14951                                      unsigned first =
14952                                          ExtractDRegister(instr, 22, 12);
14953                                      unsigned length = 1;
14954                                      unsigned last = first + length - 1;
14955                                      unsigned rn = (instr >> 16) & 0xf;
14956                                      // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
14957                                      vst1(CurrentCond(),
14958                                           dt,
14959                                           NeonRegisterList(DRegister(first),
14960                                                            DRegister(last),
14961                                                            spacing,
14962                                                            lane),
14963                                           AlignedMemOperand(Register(rn),
14964                                                             align,
14965                                                             PostIndex));
14966                                      break;
14967                                    }
14968                                    case 0x00000002: {
14969                                      // 0xf980000f
14970                                      if (((instr & 0xc00) == 0xc00)) {
14971                                        UnallocatedT32(instr);
14972                                        return;
14973                                      }
14974                                      DataType dt =
14975                                          Dt_size_7_Decode((instr >> 10) & 0x3);
14976                                      if (dt.Is(kDataTypeValueInvalid)) {
14977                                        UnallocatedT32(instr);
14978                                        return;
14979                                      }
14980                                      DecodeNeonAndAlign decode_neon =
14981                                          Align_index_align_1_Decode((instr >>
14982                                                                      4) &
14983                                                                         0xf,
14984                                                                     dt);
14985                                      if (!decode_neon.IsValid()) {
14986                                        UnallocatedT32(instr);
14987                                        return;
14988                                      }
14989                                      Alignment align = decode_neon.GetAlign();
14990                                      int lane = decode_neon.GetLane();
14991                                      SpacingType spacing =
14992                                          decode_neon.GetSpacing();
14993                                      unsigned first =
14994                                          ExtractDRegister(instr, 22, 12);
14995                                      unsigned length = 1;
14996                                      unsigned last = first + length - 1;
14997                                      unsigned rn = (instr >> 16) & 0xf;
14998                                      // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14999                                      vst1(CurrentCond(),
15000                                           dt,
15001                                           NeonRegisterList(DRegister(first),
15002                                                            DRegister(last),
15003                                                            spacing,
15004                                                            lane),
15005                                           AlignedMemOperand(Register(rn),
15006                                                             align,
15007                                                             Offset));
15008                                      break;
15009                                    }
15010                                  }
15011                                  break;
15012                                }
15013                                default: {
15014                                  if (((instr & 0xc00) == 0xc00) ||
15015                                      ((instr & 0xd) == 0xd)) {
15016                                    UnallocatedT32(instr);
15017                                    return;
15018                                  }
15019                                  DataType dt =
15020                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15021                                  if (dt.Is(kDataTypeValueInvalid)) {
15022                                    UnallocatedT32(instr);
15023                                    return;
15024                                  }
15025                                  DecodeNeonAndAlign decode_neon =
15026                                      Align_index_align_1_Decode((instr >> 4) &
15027                                                                     0xf,
15028                                                                 dt);
15029                                  if (!decode_neon.IsValid()) {
15030                                    UnallocatedT32(instr);
15031                                    return;
15032                                  }
15033                                  Alignment align = decode_neon.GetAlign();
15034                                  int lane = decode_neon.GetLane();
15035                                  SpacingType spacing =
15036                                      decode_neon.GetSpacing();
15037                                  unsigned first =
15038                                      ExtractDRegister(instr, 22, 12);
15039                                  unsigned length = 1;
15040                                  unsigned last = first + length - 1;
15041                                  unsigned rn = (instr >> 16) & 0xf;
15042                                  unsigned rm = instr & 0xf;
15043                                  // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15044                                  vst1(CurrentCond(),
15045                                       dt,
15046                                       NeonRegisterList(DRegister(first),
15047                                                        DRegister(last),
15048                                                        spacing,
15049                                                        lane),
15050                                       AlignedMemOperand(Register(rn),
15051                                                         align,
15052                                                         Register(rm),
15053                                                         PostIndex));
15054                                  break;
15055                                }
15056                              }
15057                              break;
15058                            }
15059                          }
15060                          break;
15061                        }
15062                        case 0x00000100: {
15063                          // 0xf9800100
15064                          switch (instr & 0x00000c00) {
15065                            case 0x00000c00: {
15066                              // 0xf9800d00
15067                              UnallocatedT32(instr);
15068                              break;
15069                            }
15070                            default: {
15071                              switch (instr & 0x0000000d) {
15072                                case 0x0000000d: {
15073                                  // 0xf980010d
15074                                  switch (instr & 0x00000002) {
15075                                    case 0x00000000: {
15076                                      // 0xf980010d
15077                                      if (((instr & 0xc00) == 0xc00)) {
15078                                        UnallocatedT32(instr);
15079                                        return;
15080                                      }
15081                                      DataType dt =
15082                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15083                                      if (dt.Is(kDataTypeValueInvalid)) {
15084                                        UnallocatedT32(instr);
15085                                        return;
15086                                      }
15087                                      DecodeNeonAndAlign decode_neon =
15088                                          Align_index_align_2_Decode((instr >>
15089                                                                      4) &
15090                                                                         0xf,
15091                                                                     dt);
15092                                      if (!decode_neon.IsValid()) {
15093                                        UnallocatedT32(instr);
15094                                        return;
15095                                      }
15096                                      Alignment align = decode_neon.GetAlign();
15097                                      int lane = decode_neon.GetLane();
15098                                      SpacingType spacing =
15099                                          decode_neon.GetSpacing();
15100                                      unsigned first =
15101                                          ExtractDRegister(instr, 22, 12);
15102                                      unsigned length = 2;
15103                                      unsigned last =
15104                                          first +
15105                                          (length - 1) *
15106                                              (spacing == kSingle ? 1 : 2);
15107                                      unsigned rn = (instr >> 16) & 0xf;
15108                                      // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15109                                      vst2(CurrentCond(),
15110                                           dt,
15111                                           NeonRegisterList(DRegister(first),
15112                                                            DRegister(last),
15113                                                            spacing,
15114                                                            lane),
15115                                           AlignedMemOperand(Register(rn),
15116                                                             align,
15117                                                             PostIndex));
15118                                      break;
15119                                    }
15120                                    case 0x00000002: {
15121                                      // 0xf980010f
15122                                      if (((instr & 0xc00) == 0xc00)) {
15123                                        UnallocatedT32(instr);
15124                                        return;
15125                                      }
15126                                      DataType dt =
15127                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15128                                      if (dt.Is(kDataTypeValueInvalid)) {
15129                                        UnallocatedT32(instr);
15130                                        return;
15131                                      }
15132                                      DecodeNeonAndAlign decode_neon =
15133                                          Align_index_align_2_Decode((instr >>
15134                                                                      4) &
15135                                                                         0xf,
15136                                                                     dt);
15137                                      if (!decode_neon.IsValid()) {
15138                                        UnallocatedT32(instr);
15139                                        return;
15140                                      }
15141                                      Alignment align = decode_neon.GetAlign();
15142                                      int lane = decode_neon.GetLane();
15143                                      SpacingType spacing =
15144                                          decode_neon.GetSpacing();
15145                                      unsigned first =
15146                                          ExtractDRegister(instr, 22, 12);
15147                                      unsigned length = 2;
15148                                      unsigned last =
15149                                          first +
15150                                          (length - 1) *
15151                                              (spacing == kSingle ? 1 : 2);
15152                                      unsigned rn = (instr >> 16) & 0xf;
15153                                      // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15154                                      vst2(CurrentCond(),
15155                                           dt,
15156                                           NeonRegisterList(DRegister(first),
15157                                                            DRegister(last),
15158                                                            spacing,
15159                                                            lane),
15160                                           AlignedMemOperand(Register(rn),
15161                                                             align,
15162                                                             Offset));
15163                                      break;
15164                                    }
15165                                  }
15166                                  break;
15167                                }
15168                                default: {
15169                                  if (((instr & 0xc00) == 0xc00) ||
15170                                      ((instr & 0xd) == 0xd)) {
15171                                    UnallocatedT32(instr);
15172                                    return;
15173                                  }
15174                                  DataType dt =
15175                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15176                                  if (dt.Is(kDataTypeValueInvalid)) {
15177                                    UnallocatedT32(instr);
15178                                    return;
15179                                  }
15180                                  DecodeNeonAndAlign decode_neon =
15181                                      Align_index_align_2_Decode((instr >> 4) &
15182                                                                     0xf,
15183                                                                 dt);
15184                                  if (!decode_neon.IsValid()) {
15185                                    UnallocatedT32(instr);
15186                                    return;
15187                                  }
15188                                  Alignment align = decode_neon.GetAlign();
15189                                  int lane = decode_neon.GetLane();
15190                                  SpacingType spacing =
15191                                      decode_neon.GetSpacing();
15192                                  unsigned first =
15193                                      ExtractDRegister(instr, 22, 12);
15194                                  unsigned length = 2;
15195                                  unsigned last =
15196                                      first +
15197                                      (length - 1) *
15198                                          (spacing == kSingle ? 1 : 2);
15199                                  unsigned rn = (instr >> 16) & 0xf;
15200                                  unsigned rm = instr & 0xf;
15201                                  // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15202                                  vst2(CurrentCond(),
15203                                       dt,
15204                                       NeonRegisterList(DRegister(first),
15205                                                        DRegister(last),
15206                                                        spacing,
15207                                                        lane),
15208                                       AlignedMemOperand(Register(rn),
15209                                                         align,
15210                                                         Register(rm),
15211                                                         PostIndex));
15212                                  break;
15213                                }
15214                              }
15215                              break;
15216                            }
15217                          }
15218                          break;
15219                        }
15220                        case 0x00000200: {
15221                          // 0xf9800200
15222                          switch (instr & 0x00000c30) {
15223                            case 0x00000010: {
15224                              // 0xf9800210
15225                              UnallocatedT32(instr);
15226                              break;
15227                            }
15228                            case 0x00000030: {
15229                              // 0xf9800230
15230                              UnallocatedT32(instr);
15231                              break;
15232                            }
15233                            case 0x00000410: {
15234                              // 0xf9800610
15235                              UnallocatedT32(instr);
15236                              break;
15237                            }
15238                            case 0x00000430: {
15239                              // 0xf9800630
15240                              UnallocatedT32(instr);
15241                              break;
15242                            }
15243                            case 0x00000810: {
15244                              // 0xf9800a10
15245                              UnallocatedT32(instr);
15246                              break;
15247                            }
15248                            case 0x00000820: {
15249                              // 0xf9800a20
15250                              UnallocatedT32(instr);
15251                              break;
15252                            }
15253                            case 0x00000830: {
15254                              // 0xf9800a30
15255                              UnallocatedT32(instr);
15256                              break;
15257                            }
15258                            case 0x00000c00: {
15259                              // 0xf9800e00
15260                              UnallocatedT32(instr);
15261                              break;
15262                            }
15263                            case 0x00000c10: {
15264                              // 0xf9800e10
15265                              UnallocatedT32(instr);
15266                              break;
15267                            }
15268                            case 0x00000c20: {
15269                              // 0xf9800e20
15270                              UnallocatedT32(instr);
15271                              break;
15272                            }
15273                            case 0x00000c30: {
15274                              // 0xf9800e30
15275                              UnallocatedT32(instr);
15276                              break;
15277                            }
15278                            default: {
15279                              switch (instr & 0x0000000d) {
15280                                case 0x0000000d: {
15281                                  // 0xf980020d
15282                                  switch (instr & 0x00000002) {
15283                                    case 0x00000000: {
15284                                      // 0xf980020d
15285                                      if (((instr & 0xc00) == 0xc00) ||
15286                                          ((instr & 0x810) == 0x10) ||
15287                                          ((instr & 0xc30) == 0x810) ||
15288                                          ((instr & 0xc30) == 0x820) ||
15289                                          ((instr & 0xc30) == 0x830)) {
15290                                        UnallocatedT32(instr);
15291                                        return;
15292                                      }
15293                                      DataType dt =
15294                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15295                                      if (dt.Is(kDataTypeValueInvalid)) {
15296                                        UnallocatedT32(instr);
15297                                        return;
15298                                      }
15299                                      DecodeNeon decode_neon =
15300                                          Index_1_Decode((instr >> 4) & 0xf,
15301                                                         dt);
15302                                      if (!decode_neon.IsValid()) {
15303                                        UnallocatedT32(instr);
15304                                        return;
15305                                      }
15306                                      int lane = decode_neon.GetLane();
15307                                      SpacingType spacing =
15308                                          decode_neon.GetSpacing();
15309                                      unsigned first =
15310                                          ExtractDRegister(instr, 22, 12);
15311                                      unsigned length = 3;
15312                                      unsigned last =
15313                                          first +
15314                                          (length - 1) *
15315                                              (spacing == kSingle ? 1 : 2);
15316                                      unsigned rn = (instr >> 16) & 0xf;
15317                                      // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
15318                                      vst3(CurrentCond(),
15319                                           dt,
15320                                           NeonRegisterList(DRegister(first),
15321                                                            DRegister(last),
15322                                                            spacing,
15323                                                            lane),
15324                                           MemOperand(Register(rn), PostIndex));
15325                                      break;
15326                                    }
15327                                    case 0x00000002: {
15328                                      // 0xf980020f
15329                                      if (((instr & 0xc00) == 0xc00) ||
15330                                          ((instr & 0x810) == 0x10) ||
15331                                          ((instr & 0xc30) == 0x810) ||
15332                                          ((instr & 0xc30) == 0x820) ||
15333                                          ((instr & 0xc30) == 0x830)) {
15334                                        UnallocatedT32(instr);
15335                                        return;
15336                                      }
15337                                      DataType dt =
15338                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15339                                      if (dt.Is(kDataTypeValueInvalid)) {
15340                                        UnallocatedT32(instr);
15341                                        return;
15342                                      }
15343                                      DecodeNeon decode_neon =
15344                                          Index_1_Decode((instr >> 4) & 0xf,
15345                                                         dt);
15346                                      if (!decode_neon.IsValid()) {
15347                                        UnallocatedT32(instr);
15348                                        return;
15349                                      }
15350                                      int lane = decode_neon.GetLane();
15351                                      SpacingType spacing =
15352                                          decode_neon.GetSpacing();
15353                                      unsigned first =
15354                                          ExtractDRegister(instr, 22, 12);
15355                                      unsigned length = 3;
15356                                      unsigned last =
15357                                          first +
15358                                          (length - 1) *
15359                                              (spacing == kSingle ? 1 : 2);
15360                                      unsigned rn = (instr >> 16) & 0xf;
15361                                      // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
15362                                      vst3(CurrentCond(),
15363                                           dt,
15364                                           NeonRegisterList(DRegister(first),
15365                                                            DRegister(last),
15366                                                            spacing,
15367                                                            lane),
15368                                           MemOperand(Register(rn), Offset));
15369                                      break;
15370                                    }
15371                                  }
15372                                  break;
15373                                }
15374                                default: {
15375                                  if (((instr & 0xc00) == 0xc00) ||
15376                                      ((instr & 0xd) == 0xd) ||
15377                                      ((instr & 0x810) == 0x10) ||
15378                                      ((instr & 0xc30) == 0x810) ||
15379                                      ((instr & 0xc30) == 0x820) ||
15380                                      ((instr & 0xc30) == 0x830)) {
15381                                    UnallocatedT32(instr);
15382                                    return;
15383                                  }
15384                                  DataType dt =
15385                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15386                                  if (dt.Is(kDataTypeValueInvalid)) {
15387                                    UnallocatedT32(instr);
15388                                    return;
15389                                  }
15390                                  DecodeNeon decode_neon =
15391                                      Index_1_Decode((instr >> 4) & 0xf, dt);
15392                                  if (!decode_neon.IsValid()) {
15393                                    UnallocatedT32(instr);
15394                                    return;
15395                                  }
15396                                  int lane = decode_neon.GetLane();
15397                                  SpacingType spacing =
15398                                      decode_neon.GetSpacing();
15399                                  unsigned first =
15400                                      ExtractDRegister(instr, 22, 12);
15401                                  unsigned length = 3;
15402                                  unsigned last =
15403                                      first +
15404                                      (length - 1) *
15405                                          (spacing == kSingle ? 1 : 2);
15406                                  unsigned rn = (instr >> 16) & 0xf;
15407                                  Sign sign(plus);
15408                                  unsigned rm = instr & 0xf;
15409                                  // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
15410                                  vst3(CurrentCond(),
15411                                       dt,
15412                                       NeonRegisterList(DRegister(first),
15413                                                        DRegister(last),
15414                                                        spacing,
15415                                                        lane),
15416                                       MemOperand(Register(rn),
15417                                                  sign,
15418                                                  Register(rm),
15419                                                  PostIndex));
15420                                  break;
15421                                }
15422                              }
15423                              break;
15424                            }
15425                          }
15426                          break;
15427                        }
15428                        case 0x00000300: {
15429                          // 0xf9800300
15430                          switch (instr & 0x00000c00) {
15431                            case 0x00000c00: {
15432                              // 0xf9800f00
15433                              UnallocatedT32(instr);
15434                              break;
15435                            }
15436                            default: {
15437                              switch (instr & 0x0000000d) {
15438                                case 0x0000000d: {
15439                                  // 0xf980030d
15440                                  switch (instr & 0x00000002) {
15441                                    case 0x00000000: {
15442                                      // 0xf980030d
15443                                      if (((instr & 0xc00) == 0xc00)) {
15444                                        UnallocatedT32(instr);
15445                                        return;
15446                                      }
15447                                      DataType dt =
15448                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15449                                      if (dt.Is(kDataTypeValueInvalid)) {
15450                                        UnallocatedT32(instr);
15451                                        return;
15452                                      }
15453                                      DecodeNeonAndAlign decode_neon =
15454                                          Align_index_align_3_Decode((instr >>
15455                                                                      4) &
15456                                                                         0xf,
15457                                                                     dt);
15458                                      if (!decode_neon.IsValid()) {
15459                                        UnallocatedT32(instr);
15460                                        return;
15461                                      }
15462                                      Alignment align = decode_neon.GetAlign();
15463                                      int lane = decode_neon.GetLane();
15464                                      SpacingType spacing =
15465                                          decode_neon.GetSpacing();
15466                                      unsigned first =
15467                                          ExtractDRegister(instr, 22, 12);
15468                                      unsigned length = 4;
15469                                      unsigned last =
15470                                          first +
15471                                          (length - 1) *
15472                                              (spacing == kSingle ? 1 : 2);
15473                                      unsigned rn = (instr >> 16) & 0xf;
15474                                      // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15475                                      vst4(CurrentCond(),
15476                                           dt,
15477                                           NeonRegisterList(DRegister(first),
15478                                                            DRegister(last),
15479                                                            spacing,
15480                                                            lane),
15481                                           AlignedMemOperand(Register(rn),
15482                                                             align,
15483                                                             PostIndex));
15484                                      break;
15485                                    }
15486                                    case 0x00000002: {
15487                                      // 0xf980030f
15488                                      if (((instr & 0xc00) == 0xc00)) {
15489                                        UnallocatedT32(instr);
15490                                        return;
15491                                      }
15492                                      DataType dt =
15493                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15494                                      if (dt.Is(kDataTypeValueInvalid)) {
15495                                        UnallocatedT32(instr);
15496                                        return;
15497                                      }
15498                                      DecodeNeonAndAlign decode_neon =
15499                                          Align_index_align_3_Decode((instr >>
15500                                                                      4) &
15501                                                                         0xf,
15502                                                                     dt);
15503                                      if (!decode_neon.IsValid()) {
15504                                        UnallocatedT32(instr);
15505                                        return;
15506                                      }
15507                                      Alignment align = decode_neon.GetAlign();
15508                                      int lane = decode_neon.GetLane();
15509                                      SpacingType spacing =
15510                                          decode_neon.GetSpacing();
15511                                      unsigned first =
15512                                          ExtractDRegister(instr, 22, 12);
15513                                      unsigned length = 4;
15514                                      unsigned last =
15515                                          first +
15516                                          (length - 1) *
15517                                              (spacing == kSingle ? 1 : 2);
15518                                      unsigned rn = (instr >> 16) & 0xf;
15519                                      // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15520                                      vst4(CurrentCond(),
15521                                           dt,
15522                                           NeonRegisterList(DRegister(first),
15523                                                            DRegister(last),
15524                                                            spacing,
15525                                                            lane),
15526                                           AlignedMemOperand(Register(rn),
15527                                                             align,
15528                                                             Offset));
15529                                      break;
15530                                    }
15531                                  }
15532                                  break;
15533                                }
15534                                default: {
15535                                  if (((instr & 0xc00) == 0xc00) ||
15536                                      ((instr & 0xd) == 0xd)) {
15537                                    UnallocatedT32(instr);
15538                                    return;
15539                                  }
15540                                  DataType dt =
15541                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15542                                  if (dt.Is(kDataTypeValueInvalid)) {
15543                                    UnallocatedT32(instr);
15544                                    return;
15545                                  }
15546                                  DecodeNeonAndAlign decode_neon =
15547                                      Align_index_align_3_Decode((instr >> 4) &
15548                                                                     0xf,
15549                                                                 dt);
15550                                  if (!decode_neon.IsValid()) {
15551                                    UnallocatedT32(instr);
15552                                    return;
15553                                  }
15554                                  Alignment align = decode_neon.GetAlign();
15555                                  int lane = decode_neon.GetLane();
15556                                  SpacingType spacing =
15557                                      decode_neon.GetSpacing();
15558                                  unsigned first =
15559                                      ExtractDRegister(instr, 22, 12);
15560                                  unsigned length = 4;
15561                                  unsigned last =
15562                                      first +
15563                                      (length - 1) *
15564                                          (spacing == kSingle ? 1 : 2);
15565                                  unsigned rn = (instr >> 16) & 0xf;
15566                                  unsigned rm = instr & 0xf;
15567                                  // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15568                                  vst4(CurrentCond(),
15569                                       dt,
15570                                       NeonRegisterList(DRegister(first),
15571                                                        DRegister(last),
15572                                                        spacing,
15573                                                        lane),
15574                                       AlignedMemOperand(Register(rn),
15575                                                         align,
15576                                                         Register(rm),
15577                                                         PostIndex));
15578                                  break;
15579                                }
15580                              }
15581                              break;
15582                            }
15583                          }
15584                          break;
15585                        }
15586                      }
15587                      break;
15588                    }
15589                    case 0x01a00000: {
15590                      // 0xf9a00000
15591                      switch (instr & 0x00000300) {
15592                        case 0x00000000: {
15593                          // 0xf9a00000
15594                          switch (instr & 0x00000c00) {
15595                            case 0x00000c00: {
15596                              // 0xf9a00c00
15597                              switch (instr & 0x0000000d) {
15598                                case 0x0000000d: {
15599                                  // 0xf9a00c0d
15600                                  switch (instr & 0x00000002) {
15601                                    case 0x00000000: {
15602                                      // 0xf9a00c0d
15603                                      DataType dt =
15604                                          Dt_size_7_Decode((instr >> 6) & 0x3);
15605                                      if (dt.Is(kDataTypeValueInvalid)) {
15606                                        UnallocatedT32(instr);
15607                                        return;
15608                                      }
15609                                      Alignment align =
15610                                          Align_a_1_Decode((instr >> 4) & 0x1,
15611                                                           dt);
15612                                      if (dt.Is(kDataTypeValueInvalid) ||
15613                                          align.Is(kBadAlignment)) {
15614                                        UnallocatedT32(instr);
15615                                        return;
15616                                      }
15617                                      unsigned first =
15618                                          ExtractDRegister(instr, 22, 12);
15619                                      unsigned length;
15620                                      SpacingType spacing = kSingle;
15621                                      switch ((instr >> 5) & 0x1) {
15622                                        default:
15623                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
15624                                        case 0x0:
15625                                          length = 1;
15626                                          break;
15627                                        case 0x1:
15628                                          length = 2;
15629                                          break;
15630                                      }
15631                                      unsigned last = first + length - 1;
15632                                      TransferType transfer = kAllLanes;
15633                                      unsigned rn = (instr >> 16) & 0xf;
15634                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15635                                      vld1(CurrentCond(),
15636                                           dt,
15637                                           NeonRegisterList(DRegister(first),
15638                                                            DRegister(last),
15639                                                            spacing,
15640                                                            transfer),
15641                                           AlignedMemOperand(Register(rn),
15642                                                             align,
15643                                                             PostIndex));
15644                                      break;
15645                                    }
15646                                    case 0x00000002: {
15647                                      // 0xf9a00c0f
15648                                      DataType dt =
15649                                          Dt_size_7_Decode((instr >> 6) & 0x3);
15650                                      if (dt.Is(kDataTypeValueInvalid)) {
15651                                        UnallocatedT32(instr);
15652                                        return;
15653                                      }
15654                                      Alignment align =
15655                                          Align_a_1_Decode((instr >> 4) & 0x1,
15656                                                           dt);
15657                                      if (dt.Is(kDataTypeValueInvalid) ||
15658                                          align.Is(kBadAlignment)) {
15659                                        UnallocatedT32(instr);
15660                                        return;
15661                                      }
15662                                      unsigned first =
15663                                          ExtractDRegister(instr, 22, 12);
15664                                      unsigned length;
15665                                      SpacingType spacing = kSingle;
15666                                      switch ((instr >> 5) & 0x1) {
15667                                        default:
15668                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
15669                                        case 0x0:
15670                                          length = 1;
15671                                          break;
15672                                        case 0x1:
15673                                          length = 2;
15674                                          break;
15675                                      }
15676                                      unsigned last = first + length - 1;
15677                                      TransferType transfer = kAllLanes;
15678                                      unsigned rn = (instr >> 16) & 0xf;
15679                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15680                                      vld1(CurrentCond(),
15681                                           dt,
15682                                           NeonRegisterList(DRegister(first),
15683                                                            DRegister(last),
15684                                                            spacing,
15685                                                            transfer),
15686                                           AlignedMemOperand(Register(rn),
15687                                                             align,
15688                                                             Offset));
15689                                      break;
15690                                    }
15691                                  }
15692                                  break;
15693                                }
15694                                default: {
15695                                  if (((instr & 0xd) == 0xd)) {
15696                                    UnallocatedT32(instr);
15697                                    return;
15698                                  }
15699                                  DataType dt =
15700                                      Dt_size_7_Decode((instr >> 6) & 0x3);
15701                                  if (dt.Is(kDataTypeValueInvalid)) {
15702                                    UnallocatedT32(instr);
15703                                    return;
15704                                  }
15705                                  Alignment align =
15706                                      Align_a_1_Decode((instr >> 4) & 0x1, dt);
15707                                  if (dt.Is(kDataTypeValueInvalid) ||
15708                                      align.Is(kBadAlignment)) {
15709                                    UnallocatedT32(instr);
15710                                    return;
15711                                  }
15712                                  unsigned first =
15713                                      ExtractDRegister(instr, 22, 12);
15714                                  unsigned length;
15715                                  SpacingType spacing = kSingle;
15716                                  switch ((instr >> 5) & 0x1) {
15717                                    default:
15718                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
15719                                    case 0x0:
15720                                      length = 1;
15721                                      break;
15722                                    case 0x1:
15723                                      length = 2;
15724                                      break;
15725                                  }
15726                                  unsigned last = first + length - 1;
15727                                  TransferType transfer = kAllLanes;
15728                                  unsigned rn = (instr >> 16) & 0xf;
15729                                  unsigned rm = instr & 0xf;
15730                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15731                                  vld1(CurrentCond(),
15732                                       dt,
15733                                       NeonRegisterList(DRegister(first),
15734                                                        DRegister(last),
15735                                                        spacing,
15736                                                        transfer),
15737                                       AlignedMemOperand(Register(rn),
15738                                                         align,
15739                                                         Register(rm),
15740                                                         PostIndex));
15741                                  break;
15742                                }
15743                              }
15744                              break;
15745                            }
15746                            default: {
15747                              switch (instr & 0x0000000d) {
15748                                case 0x0000000d: {
15749                                  // 0xf9a0000d
15750                                  switch (instr & 0x00000002) {
15751                                    case 0x00000000: {
15752                                      // 0xf9a0000d
15753                                      if (((instr & 0xc00) == 0xc00)) {
15754                                        UnallocatedT32(instr);
15755                                        return;
15756                                      }
15757                                      DataType dt =
15758                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15759                                      if (dt.Is(kDataTypeValueInvalid)) {
15760                                        UnallocatedT32(instr);
15761                                        return;
15762                                      }
15763                                      DecodeNeonAndAlign decode_neon =
15764                                          Align_index_align_1_Decode((instr >>
15765                                                                      4) &
15766                                                                         0xf,
15767                                                                     dt);
15768                                      if (!decode_neon.IsValid()) {
15769                                        UnallocatedT32(instr);
15770                                        return;
15771                                      }
15772                                      Alignment align = decode_neon.GetAlign();
15773                                      int lane = decode_neon.GetLane();
15774                                      SpacingType spacing =
15775                                          decode_neon.GetSpacing();
15776                                      unsigned first =
15777                                          ExtractDRegister(instr, 22, 12);
15778                                      unsigned length = 1;
15779                                      unsigned last = first + length - 1;
15780                                      unsigned rn = (instr >> 16) & 0xf;
15781                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15782                                      vld1(CurrentCond(),
15783                                           dt,
15784                                           NeonRegisterList(DRegister(first),
15785                                                            DRegister(last),
15786                                                            spacing,
15787                                                            lane),
15788                                           AlignedMemOperand(Register(rn),
15789                                                             align,
15790                                                             PostIndex));
15791                                      break;
15792                                    }
15793                                    case 0x00000002: {
15794                                      // 0xf9a0000f
15795                                      if (((instr & 0xc00) == 0xc00)) {
15796                                        UnallocatedT32(instr);
15797                                        return;
15798                                      }
15799                                      DataType dt =
15800                                          Dt_size_7_Decode((instr >> 10) & 0x3);
15801                                      if (dt.Is(kDataTypeValueInvalid)) {
15802                                        UnallocatedT32(instr);
15803                                        return;
15804                                      }
15805                                      DecodeNeonAndAlign decode_neon =
15806                                          Align_index_align_1_Decode((instr >>
15807                                                                      4) &
15808                                                                         0xf,
15809                                                                     dt);
15810                                      if (!decode_neon.IsValid()) {
15811                                        UnallocatedT32(instr);
15812                                        return;
15813                                      }
15814                                      Alignment align = decode_neon.GetAlign();
15815                                      int lane = decode_neon.GetLane();
15816                                      SpacingType spacing =
15817                                          decode_neon.GetSpacing();
15818                                      unsigned first =
15819                                          ExtractDRegister(instr, 22, 12);
15820                                      unsigned length = 1;
15821                                      unsigned last = first + length - 1;
15822                                      unsigned rn = (instr >> 16) & 0xf;
15823                                      // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15824                                      vld1(CurrentCond(),
15825                                           dt,
15826                                           NeonRegisterList(DRegister(first),
15827                                                            DRegister(last),
15828                                                            spacing,
15829                                                            lane),
15830                                           AlignedMemOperand(Register(rn),
15831                                                             align,
15832                                                             Offset));
15833                                      break;
15834                                    }
15835                                  }
15836                                  break;
15837                                }
15838                                default: {
15839                                  if (((instr & 0xc00) == 0xc00) ||
15840                                      ((instr & 0xd) == 0xd)) {
15841                                    UnallocatedT32(instr);
15842                                    return;
15843                                  }
15844                                  DataType dt =
15845                                      Dt_size_7_Decode((instr >> 10) & 0x3);
15846                                  if (dt.Is(kDataTypeValueInvalid)) {
15847                                    UnallocatedT32(instr);
15848                                    return;
15849                                  }
15850                                  DecodeNeonAndAlign decode_neon =
15851                                      Align_index_align_1_Decode((instr >> 4) &
15852                                                                     0xf,
15853                                                                 dt);
15854                                  if (!decode_neon.IsValid()) {
15855                                    UnallocatedT32(instr);
15856                                    return;
15857                                  }
15858                                  Alignment align = decode_neon.GetAlign();
15859                                  int lane = decode_neon.GetLane();
15860                                  SpacingType spacing =
15861                                      decode_neon.GetSpacing();
15862                                  unsigned first =
15863                                      ExtractDRegister(instr, 22, 12);
15864                                  unsigned length = 1;
15865                                  unsigned last = first + length - 1;
15866                                  unsigned rn = (instr >> 16) & 0xf;
15867                                  unsigned rm = instr & 0xf;
15868                                  // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15869                                  vld1(CurrentCond(),
15870                                       dt,
15871                                       NeonRegisterList(DRegister(first),
15872                                                        DRegister(last),
15873                                                        spacing,
15874                                                        lane),
15875                                       AlignedMemOperand(Register(rn),
15876                                                         align,
15877                                                         Register(rm),
15878                                                         PostIndex));
15879                                  break;
15880                                }
15881                              }
15882                              break;
15883                            }
15884                          }
15885                          break;
15886                        }
15887                        case 0x00000100: {
15888                          // 0xf9a00100
15889                          switch (instr & 0x00000c00) {
15890                            case 0x00000c00: {
15891                              // 0xf9a00d00
15892                              switch (instr & 0x0000000d) {
15893                                case 0x0000000d: {
15894                                  // 0xf9a00d0d
15895                                  switch (instr & 0x00000002) {
15896                                    case 0x00000000: {
15897                                      // 0xf9a00d0d
15898                                      DataType dt =
15899                                          Dt_size_7_Decode((instr >> 6) & 0x3);
15900                                      if (dt.Is(kDataTypeValueInvalid)) {
15901                                        UnallocatedT32(instr);
15902                                        return;
15903                                      }
15904                                      Alignment align =
15905                                          Align_a_2_Decode((instr >> 4) & 0x1,
15906                                                           dt);
15907                                      if (dt.Is(kDataTypeValueInvalid) ||
15908                                          align.Is(kBadAlignment)) {
15909                                        UnallocatedT32(instr);
15910                                        return;
15911                                      }
15912                                      unsigned first =
15913                                          ExtractDRegister(instr, 22, 12);
15914                                      unsigned length;
15915                                      SpacingType spacing;
15916                                      switch ((instr >> 5) & 0x1) {
15917                                        default:
15918                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
15919                                        case 0x0:
15920                                          length = 2;
15921                                          spacing = kSingle;
15922                                          break;
15923                                        case 0x1:
15924                                          length = 2;
15925                                          spacing = kDouble;
15926                                          break;
15927                                      }
15928                                      unsigned last =
15929                                          first +
15930                                          (length - 1) *
15931                                              (spacing == kSingle ? 1 : 2);
15932                                      TransferType transfer = kAllLanes;
15933                                      unsigned rn = (instr >> 16) & 0xf;
15934                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15935                                      vld2(CurrentCond(),
15936                                           dt,
15937                                           NeonRegisterList(DRegister(first),
15938                                                            DRegister(last),
15939                                                            spacing,
15940                                                            transfer),
15941                                           AlignedMemOperand(Register(rn),
15942                                                             align,
15943                                                             PostIndex));
15944                                      break;
15945                                    }
15946                                    case 0x00000002: {
15947                                      // 0xf9a00d0f
15948                                      DataType dt =
15949                                          Dt_size_7_Decode((instr >> 6) & 0x3);
15950                                      if (dt.Is(kDataTypeValueInvalid)) {
15951                                        UnallocatedT32(instr);
15952                                        return;
15953                                      }
15954                                      Alignment align =
15955                                          Align_a_2_Decode((instr >> 4) & 0x1,
15956                                                           dt);
15957                                      if (dt.Is(kDataTypeValueInvalid) ||
15958                                          align.Is(kBadAlignment)) {
15959                                        UnallocatedT32(instr);
15960                                        return;
15961                                      }
15962                                      unsigned first =
15963                                          ExtractDRegister(instr, 22, 12);
15964                                      unsigned length;
15965                                      SpacingType spacing;
15966                                      switch ((instr >> 5) & 0x1) {
15967                                        default:
15968                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
15969                                        case 0x0:
15970                                          length = 2;
15971                                          spacing = kSingle;
15972                                          break;
15973                                        case 0x1:
15974                                          length = 2;
15975                                          spacing = kDouble;
15976                                          break;
15977                                      }
15978                                      unsigned last =
15979                                          first +
15980                                          (length - 1) *
15981                                              (spacing == kSingle ? 1 : 2);
15982                                      TransferType transfer = kAllLanes;
15983                                      unsigned rn = (instr >> 16) & 0xf;
15984                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15985                                      vld2(CurrentCond(),
15986                                           dt,
15987                                           NeonRegisterList(DRegister(first),
15988                                                            DRegister(last),
15989                                                            spacing,
15990                                                            transfer),
15991                                           AlignedMemOperand(Register(rn),
15992                                                             align,
15993                                                             Offset));
15994                                      break;
15995                                    }
15996                                  }
15997                                  break;
15998                                }
15999                                default: {
16000                                  if (((instr & 0xd) == 0xd)) {
16001                                    UnallocatedT32(instr);
16002                                    return;
16003                                  }
16004                                  DataType dt =
16005                                      Dt_size_7_Decode((instr >> 6) & 0x3);
16006                                  if (dt.Is(kDataTypeValueInvalid)) {
16007                                    UnallocatedT32(instr);
16008                                    return;
16009                                  }
16010                                  Alignment align =
16011                                      Align_a_2_Decode((instr >> 4) & 0x1, dt);
16012                                  if (dt.Is(kDataTypeValueInvalid) ||
16013                                      align.Is(kBadAlignment)) {
16014                                    UnallocatedT32(instr);
16015                                    return;
16016                                  }
16017                                  unsigned first =
16018                                      ExtractDRegister(instr, 22, 12);
16019                                  unsigned length;
16020                                  SpacingType spacing;
16021                                  switch ((instr >> 5) & 0x1) {
16022                                    default:
16023                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
16024                                    case 0x0:
16025                                      length = 2;
16026                                      spacing = kSingle;
16027                                      break;
16028                                    case 0x1:
16029                                      length = 2;
16030                                      spacing = kDouble;
16031                                      break;
16032                                  }
16033                                  unsigned last =
16034                                      first +
16035                                      (length - 1) *
16036                                          (spacing == kSingle ? 1 : 2);
16037                                  TransferType transfer = kAllLanes;
16038                                  unsigned rn = (instr >> 16) & 0xf;
16039                                  unsigned rm = instr & 0xf;
16040                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16041                                  vld2(CurrentCond(),
16042                                       dt,
16043                                       NeonRegisterList(DRegister(first),
16044                                                        DRegister(last),
16045                                                        spacing,
16046                                                        transfer),
16047                                       AlignedMemOperand(Register(rn),
16048                                                         align,
16049                                                         Register(rm),
16050                                                         PostIndex));
16051                                  break;
16052                                }
16053                              }
16054                              break;
16055                            }
16056                            default: {
16057                              switch (instr & 0x0000000d) {
16058                                case 0x0000000d: {
16059                                  // 0xf9a0010d
16060                                  switch (instr & 0x00000002) {
16061                                    case 0x00000000: {
16062                                      // 0xf9a0010d
16063                                      if (((instr & 0xc00) == 0xc00)) {
16064                                        UnallocatedT32(instr);
16065                                        return;
16066                                      }
16067                                      DataType dt =
16068                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16069                                      if (dt.Is(kDataTypeValueInvalid)) {
16070                                        UnallocatedT32(instr);
16071                                        return;
16072                                      }
16073                                      DecodeNeonAndAlign decode_neon =
16074                                          Align_index_align_2_Decode((instr >>
16075                                                                      4) &
16076                                                                         0xf,
16077                                                                     dt);
16078                                      if (!decode_neon.IsValid()) {
16079                                        UnallocatedT32(instr);
16080                                        return;
16081                                      }
16082                                      Alignment align = decode_neon.GetAlign();
16083                                      int lane = decode_neon.GetLane();
16084                                      SpacingType spacing =
16085                                          decode_neon.GetSpacing();
16086                                      unsigned first =
16087                                          ExtractDRegister(instr, 22, 12);
16088                                      unsigned length = 2;
16089                                      unsigned last =
16090                                          first +
16091                                          (length - 1) *
16092                                              (spacing == kSingle ? 1 : 2);
16093                                      unsigned rn = (instr >> 16) & 0xf;
16094                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16095                                      vld2(CurrentCond(),
16096                                           dt,
16097                                           NeonRegisterList(DRegister(first),
16098                                                            DRegister(last),
16099                                                            spacing,
16100                                                            lane),
16101                                           AlignedMemOperand(Register(rn),
16102                                                             align,
16103                                                             PostIndex));
16104                                      break;
16105                                    }
16106                                    case 0x00000002: {
16107                                      // 0xf9a0010f
16108                                      if (((instr & 0xc00) == 0xc00)) {
16109                                        UnallocatedT32(instr);
16110                                        return;
16111                                      }
16112                                      DataType dt =
16113                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16114                                      if (dt.Is(kDataTypeValueInvalid)) {
16115                                        UnallocatedT32(instr);
16116                                        return;
16117                                      }
16118                                      DecodeNeonAndAlign decode_neon =
16119                                          Align_index_align_2_Decode((instr >>
16120                                                                      4) &
16121                                                                         0xf,
16122                                                                     dt);
16123                                      if (!decode_neon.IsValid()) {
16124                                        UnallocatedT32(instr);
16125                                        return;
16126                                      }
16127                                      Alignment align = decode_neon.GetAlign();
16128                                      int lane = decode_neon.GetLane();
16129                                      SpacingType spacing =
16130                                          decode_neon.GetSpacing();
16131                                      unsigned first =
16132                                          ExtractDRegister(instr, 22, 12);
16133                                      unsigned length = 2;
16134                                      unsigned last =
16135                                          first +
16136                                          (length - 1) *
16137                                              (spacing == kSingle ? 1 : 2);
16138                                      unsigned rn = (instr >> 16) & 0xf;
16139                                      // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16140                                      vld2(CurrentCond(),
16141                                           dt,
16142                                           NeonRegisterList(DRegister(first),
16143                                                            DRegister(last),
16144                                                            spacing,
16145                                                            lane),
16146                                           AlignedMemOperand(Register(rn),
16147                                                             align,
16148                                                             Offset));
16149                                      break;
16150                                    }
16151                                  }
16152                                  break;
16153                                }
16154                                default: {
16155                                  if (((instr & 0xc00) == 0xc00) ||
16156                                      ((instr & 0xd) == 0xd)) {
16157                                    UnallocatedT32(instr);
16158                                    return;
16159                                  }
16160                                  DataType dt =
16161                                      Dt_size_7_Decode((instr >> 10) & 0x3);
16162                                  if (dt.Is(kDataTypeValueInvalid)) {
16163                                    UnallocatedT32(instr);
16164                                    return;
16165                                  }
16166                                  DecodeNeonAndAlign decode_neon =
16167                                      Align_index_align_2_Decode((instr >> 4) &
16168                                                                     0xf,
16169                                                                 dt);
16170                                  if (!decode_neon.IsValid()) {
16171                                    UnallocatedT32(instr);
16172                                    return;
16173                                  }
16174                                  Alignment align = decode_neon.GetAlign();
16175                                  int lane = decode_neon.GetLane();
16176                                  SpacingType spacing =
16177                                      decode_neon.GetSpacing();
16178                                  unsigned first =
16179                                      ExtractDRegister(instr, 22, 12);
16180                                  unsigned length = 2;
16181                                  unsigned last =
16182                                      first +
16183                                      (length - 1) *
16184                                          (spacing == kSingle ? 1 : 2);
16185                                  unsigned rn = (instr >> 16) & 0xf;
16186                                  unsigned rm = instr & 0xf;
16187                                  // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16188                                  vld2(CurrentCond(),
16189                                       dt,
16190                                       NeonRegisterList(DRegister(first),
16191                                                        DRegister(last),
16192                                                        spacing,
16193                                                        lane),
16194                                       AlignedMemOperand(Register(rn),
16195                                                         align,
16196                                                         Register(rm),
16197                                                         PostIndex));
16198                                  break;
16199                                }
16200                              }
16201                              break;
16202                            }
16203                          }
16204                          break;
16205                        }
16206                        case 0x00000200: {
16207                          // 0xf9a00200
16208                          switch (instr & 0x00000c00) {
16209                            case 0x00000c00: {
16210                              // 0xf9a00e00
16211                              switch (instr & 0x00000010) {
16212                                case 0x00000000: {
16213                                  // 0xf9a00e00
16214                                  switch (instr & 0x0000000d) {
16215                                    case 0x0000000d: {
16216                                      // 0xf9a00e0d
16217                                      switch (instr & 0x00000002) {
16218                                        case 0x00000000: {
16219                                          // 0xf9a00e0d
16220                                          DataType dt = Dt_size_7_Decode(
16221                                              (instr >> 6) & 0x3);
16222                                          if (dt.Is(kDataTypeValueInvalid)) {
16223                                            UnallocatedT32(instr);
16224                                            return;
16225                                          }
16226                                          unsigned first =
16227                                              ExtractDRegister(instr, 22, 12);
16228                                          unsigned length;
16229                                          SpacingType spacing;
16230                                          switch ((instr >> 5) & 0x1) {
16231                                            default:
16232                                              VIXL_UNREACHABLE_OR_FALLTHROUGH();
16233                                            case 0x0:
16234                                              length = 3;
16235                                              spacing = kSingle;
16236                                              break;
16237                                            case 0x1:
16238                                              length = 3;
16239                                              spacing = kDouble;
16240                                              break;
16241                                          }
16242                                          unsigned last =
16243                                              first +
16244                                              (length - 1) *
16245                                                  (spacing == kSingle ? 1 : 2);
16246                                          TransferType transfer = kAllLanes;
16247                                          unsigned rn = (instr >> 16) & 0xf;
16248                                          // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
16249                                          vld3(CurrentCond(),
16250                                               dt,
16251                                               NeonRegisterList(DRegister(
16252                                                                    first),
16253                                                                DRegister(last),
16254                                                                spacing,
16255                                                                transfer),
16256                                               MemOperand(Register(rn),
16257                                                          PostIndex));
16258                                          break;
16259                                        }
16260                                        case 0x00000002: {
16261                                          // 0xf9a00e0f
16262                                          DataType dt = Dt_size_7_Decode(
16263                                              (instr >> 6) & 0x3);
16264                                          if (dt.Is(kDataTypeValueInvalid)) {
16265                                            UnallocatedT32(instr);
16266                                            return;
16267                                          }
16268                                          unsigned first =
16269                                              ExtractDRegister(instr, 22, 12);
16270                                          unsigned length;
16271                                          SpacingType spacing;
16272                                          switch ((instr >> 5) & 0x1) {
16273                                            default:
16274                                              VIXL_UNREACHABLE_OR_FALLTHROUGH();
16275                                            case 0x0:
16276                                              length = 3;
16277                                              spacing = kSingle;
16278                                              break;
16279                                            case 0x1:
16280                                              length = 3;
16281                                              spacing = kDouble;
16282                                              break;
16283                                          }
16284                                          unsigned last =
16285                                              first +
16286                                              (length - 1) *
16287                                                  (spacing == kSingle ? 1 : 2);
16288                                          TransferType transfer = kAllLanes;
16289                                          unsigned rn = (instr >> 16) & 0xf;
16290                                          // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
16291                                          vld3(CurrentCond(),
16292                                               dt,
16293                                               NeonRegisterList(DRegister(
16294                                                                    first),
16295                                                                DRegister(last),
16296                                                                spacing,
16297                                                                transfer),
16298                                               MemOperand(Register(rn),
16299                                                          Offset));
16300                                          break;
16301                                        }
16302                                      }
16303                                      break;
16304                                    }
16305                                    default: {
16306                                      if (((instr & 0xd) == 0xd)) {
16307                                        UnallocatedT32(instr);
16308                                        return;
16309                                      }
16310                                      DataType dt =
16311                                          Dt_size_7_Decode((instr >> 6) & 0x3);
16312                                      if (dt.Is(kDataTypeValueInvalid)) {
16313                                        UnallocatedT32(instr);
16314                                        return;
16315                                      }
16316                                      unsigned first =
16317                                          ExtractDRegister(instr, 22, 12);
16318                                      unsigned length;
16319                                      SpacingType spacing;
16320                                      switch ((instr >> 5) & 0x1) {
16321                                        default:
16322                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
16323                                        case 0x0:
16324                                          length = 3;
16325                                          spacing = kSingle;
16326                                          break;
16327                                        case 0x1:
16328                                          length = 3;
16329                                          spacing = kDouble;
16330                                          break;
16331                                      }
16332                                      unsigned last =
16333                                          first +
16334                                          (length - 1) *
16335                                              (spacing == kSingle ? 1 : 2);
16336                                      TransferType transfer = kAllLanes;
16337                                      unsigned rn = (instr >> 16) & 0xf;
16338                                      Sign sign(plus);
16339                                      unsigned rm = instr & 0xf;
16340                                      // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
16341                                      vld3(CurrentCond(),
16342                                           dt,
16343                                           NeonRegisterList(DRegister(first),
16344                                                            DRegister(last),
16345                                                            spacing,
16346                                                            transfer),
16347                                           MemOperand(Register(rn),
16348                                                      sign,
16349                                                      Register(rm),
16350                                                      PostIndex));
16351                                      break;
16352                                    }
16353                                  }
16354                                  break;
16355                                }
16356                                default:
16357                                  UnallocatedT32(instr);
16358                                  break;
16359                              }
16360                              break;
16361                            }
16362                            default: {
16363                              switch (instr & 0x0000000d) {
16364                                case 0x0000000d: {
16365                                  // 0xf9a0020d
16366                                  switch (instr & 0x00000002) {
16367                                    case 0x00000000: {
16368                                      // 0xf9a0020d
16369                                      if (((instr & 0xc00) == 0xc00)) {
16370                                        UnallocatedT32(instr);
16371                                        return;
16372                                      }
16373                                      DataType dt =
16374                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16375                                      if (dt.Is(kDataTypeValueInvalid)) {
16376                                        UnallocatedT32(instr);
16377                                        return;
16378                                      }
16379                                      DecodeNeon decode_neon =
16380                                          Index_1_Decode((instr >> 4) & 0xf,
16381                                                         dt);
16382                                      if (!decode_neon.IsValid()) {
16383                                        UnallocatedT32(instr);
16384                                        return;
16385                                      }
16386                                      int lane = decode_neon.GetLane();
16387                                      SpacingType spacing =
16388                                          decode_neon.GetSpacing();
16389                                      unsigned first =
16390                                          ExtractDRegister(instr, 22, 12);
16391                                      unsigned length = 3;
16392                                      unsigned last =
16393                                          first +
16394                                          (length - 1) *
16395                                              (spacing == kSingle ? 1 : 2);
16396                                      unsigned rn = (instr >> 16) & 0xf;
16397                                      // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
16398                                      vld3(CurrentCond(),
16399                                           dt,
16400                                           NeonRegisterList(DRegister(first),
16401                                                            DRegister(last),
16402                                                            spacing,
16403                                                            lane),
16404                                           MemOperand(Register(rn), PostIndex));
16405                                      break;
16406                                    }
16407                                    case 0x00000002: {
16408                                      // 0xf9a0020f
16409                                      if (((instr & 0xc00) == 0xc00)) {
16410                                        UnallocatedT32(instr);
16411                                        return;
16412                                      }
16413                                      DataType dt =
16414                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16415                                      if (dt.Is(kDataTypeValueInvalid)) {
16416                                        UnallocatedT32(instr);
16417                                        return;
16418                                      }
16419                                      DecodeNeon decode_neon =
16420                                          Index_1_Decode((instr >> 4) & 0xf,
16421                                                         dt);
16422                                      if (!decode_neon.IsValid()) {
16423                                        UnallocatedT32(instr);
16424                                        return;
16425                                      }
16426                                      int lane = decode_neon.GetLane();
16427                                      SpacingType spacing =
16428                                          decode_neon.GetSpacing();
16429                                      unsigned first =
16430                                          ExtractDRegister(instr, 22, 12);
16431                                      unsigned length = 3;
16432                                      unsigned last =
16433                                          first +
16434                                          (length - 1) *
16435                                              (spacing == kSingle ? 1 : 2);
16436                                      unsigned rn = (instr >> 16) & 0xf;
16437                                      // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
16438                                      vld3(CurrentCond(),
16439                                           dt,
16440                                           NeonRegisterList(DRegister(first),
16441                                                            DRegister(last),
16442                                                            spacing,
16443                                                            lane),
16444                                           MemOperand(Register(rn), Offset));
16445                                      break;
16446                                    }
16447                                  }
16448                                  break;
16449                                }
16450                                default: {
16451                                  if (((instr & 0xc00) == 0xc00) ||
16452                                      ((instr & 0xd) == 0xd)) {
16453                                    UnallocatedT32(instr);
16454                                    return;
16455                                  }
16456                                  DataType dt =
16457                                      Dt_size_7_Decode((instr >> 10) & 0x3);
16458                                  if (dt.Is(kDataTypeValueInvalid)) {
16459                                    UnallocatedT32(instr);
16460                                    return;
16461                                  }
16462                                  DecodeNeon decode_neon =
16463                                      Index_1_Decode((instr >> 4) & 0xf, dt);
16464                                  if (!decode_neon.IsValid()) {
16465                                    UnallocatedT32(instr);
16466                                    return;
16467                                  }
16468                                  int lane = decode_neon.GetLane();
16469                                  SpacingType spacing =
16470                                      decode_neon.GetSpacing();
16471                                  unsigned first =
16472                                      ExtractDRegister(instr, 22, 12);
16473                                  unsigned length = 3;
16474                                  unsigned last =
16475                                      first +
16476                                      (length - 1) *
16477                                          (spacing == kSingle ? 1 : 2);
16478                                  unsigned rn = (instr >> 16) & 0xf;
16479                                  Sign sign(plus);
16480                                  unsigned rm = instr & 0xf;
16481                                  // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
16482                                  vld3(CurrentCond(),
16483                                       dt,
16484                                       NeonRegisterList(DRegister(first),
16485                                                        DRegister(last),
16486                                                        spacing,
16487                                                        lane),
16488                                       MemOperand(Register(rn),
16489                                                  sign,
16490                                                  Register(rm),
16491                                                  PostIndex));
16492                                  break;
16493                                }
16494                              }
16495                              break;
16496                            }
16497                          }
16498                          break;
16499                        }
16500                        case 0x00000300: {
16501                          // 0xf9a00300
16502                          switch (instr & 0x00000c00) {
16503                            case 0x00000c00: {
16504                              // 0xf9a00f00
16505                              switch (instr & 0x0000000d) {
16506                                case 0x0000000d: {
16507                                  // 0xf9a00f0d
16508                                  switch (instr & 0x00000002) {
16509                                    case 0x00000000: {
16510                                      // 0xf9a00f0d
16511                                      DataType dt =
16512                                          Dt_size_8_Decode((instr >> 6) & 0x3);
16513                                      if (dt.Is(kDataTypeValueInvalid)) {
16514                                        UnallocatedT32(instr);
16515                                        return;
16516                                      }
16517                                      Alignment align =
16518                                          Align_a_3_Decode((instr >> 4) & 0x1,
16519                                                           dt,
16520                                                           (instr >> 6) & 0x3);
16521                                      if (dt.Is(kDataTypeValueInvalid) ||
16522                                          align.Is(kBadAlignment)) {
16523                                        UnallocatedT32(instr);
16524                                        return;
16525                                      }
16526                                      unsigned first =
16527                                          ExtractDRegister(instr, 22, 12);
16528                                      unsigned length;
16529                                      SpacingType spacing;
16530                                      switch ((instr >> 5) & 0x1) {
16531                                        default:
16532                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
16533                                        case 0x0:
16534                                          length = 4;
16535                                          spacing = kSingle;
16536                                          break;
16537                                        case 0x1:
16538                                          length = 4;
16539                                          spacing = kDouble;
16540                                          break;
16541                                      }
16542                                      unsigned last =
16543                                          first +
16544                                          (length - 1) *
16545                                              (spacing == kSingle ? 1 : 2);
16546                                      TransferType transfer = kAllLanes;
16547                                      unsigned rn = (instr >> 16) & 0xf;
16548                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16549                                      vld4(CurrentCond(),
16550                                           dt,
16551                                           NeonRegisterList(DRegister(first),
16552                                                            DRegister(last),
16553                                                            spacing,
16554                                                            transfer),
16555                                           AlignedMemOperand(Register(rn),
16556                                                             align,
16557                                                             PostIndex));
16558                                      break;
16559                                    }
16560                                    case 0x00000002: {
16561                                      // 0xf9a00f0f
16562                                      DataType dt =
16563                                          Dt_size_8_Decode((instr >> 6) & 0x3);
16564                                      if (dt.Is(kDataTypeValueInvalid)) {
16565                                        UnallocatedT32(instr);
16566                                        return;
16567                                      }
16568                                      Alignment align =
16569                                          Align_a_3_Decode((instr >> 4) & 0x1,
16570                                                           dt,
16571                                                           (instr >> 6) & 0x3);
16572                                      if (dt.Is(kDataTypeValueInvalid) ||
16573                                          align.Is(kBadAlignment)) {
16574                                        UnallocatedT32(instr);
16575                                        return;
16576                                      }
16577                                      unsigned first =
16578                                          ExtractDRegister(instr, 22, 12);
16579                                      unsigned length;
16580                                      SpacingType spacing;
16581                                      switch ((instr >> 5) & 0x1) {
16582                                        default:
16583                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
16584                                        case 0x0:
16585                                          length = 4;
16586                                          spacing = kSingle;
16587                                          break;
16588                                        case 0x1:
16589                                          length = 4;
16590                                          spacing = kDouble;
16591                                          break;
16592                                      }
16593                                      unsigned last =
16594                                          first +
16595                                          (length - 1) *
16596                                              (spacing == kSingle ? 1 : 2);
16597                                      TransferType transfer = kAllLanes;
16598                                      unsigned rn = (instr >> 16) & 0xf;
16599                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16600                                      vld4(CurrentCond(),
16601                                           dt,
16602                                           NeonRegisterList(DRegister(first),
16603                                                            DRegister(last),
16604                                                            spacing,
16605                                                            transfer),
16606                                           AlignedMemOperand(Register(rn),
16607                                                             align,
16608                                                             Offset));
16609                                      break;
16610                                    }
16611                                  }
16612                                  break;
16613                                }
16614                                default: {
16615                                  if (((instr & 0xd) == 0xd)) {
16616                                    UnallocatedT32(instr);
16617                                    return;
16618                                  }
16619                                  DataType dt =
16620                                      Dt_size_8_Decode((instr >> 6) & 0x3);
16621                                  if (dt.Is(kDataTypeValueInvalid)) {
16622                                    UnallocatedT32(instr);
16623                                    return;
16624                                  }
16625                                  Alignment align =
16626                                      Align_a_3_Decode((instr >> 4) & 0x1,
16627                                                       dt,
16628                                                       (instr >> 6) & 0x3);
16629                                  if (dt.Is(kDataTypeValueInvalid) ||
16630                                      align.Is(kBadAlignment)) {
16631                                    UnallocatedT32(instr);
16632                                    return;
16633                                  }
16634                                  unsigned first =
16635                                      ExtractDRegister(instr, 22, 12);
16636                                  unsigned length;
16637                                  SpacingType spacing;
16638                                  switch ((instr >> 5) & 0x1) {
16639                                    default:
16640                                      VIXL_UNREACHABLE_OR_FALLTHROUGH();
16641                                    case 0x0:
16642                                      length = 4;
16643                                      spacing = kSingle;
16644                                      break;
16645                                    case 0x1:
16646                                      length = 4;
16647                                      spacing = kDouble;
16648                                      break;
16649                                  }
16650                                  unsigned last =
16651                                      first +
16652                                      (length - 1) *
16653                                          (spacing == kSingle ? 1 : 2);
16654                                  TransferType transfer = kAllLanes;
16655                                  unsigned rn = (instr >> 16) & 0xf;
16656                                  unsigned rm = instr & 0xf;
16657                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16658                                  vld4(CurrentCond(),
16659                                       dt,
16660                                       NeonRegisterList(DRegister(first),
16661                                                        DRegister(last),
16662                                                        spacing,
16663                                                        transfer),
16664                                       AlignedMemOperand(Register(rn),
16665                                                         align,
16666                                                         Register(rm),
16667                                                         PostIndex));
16668                                  break;
16669                                }
16670                              }
16671                              break;
16672                            }
16673                            default: {
16674                              switch (instr & 0x0000000d) {
16675                                case 0x0000000d: {
16676                                  // 0xf9a0030d
16677                                  switch (instr & 0x00000002) {
16678                                    case 0x00000000: {
16679                                      // 0xf9a0030d
16680                                      if (((instr & 0xc00) == 0xc00)) {
16681                                        UnallocatedT32(instr);
16682                                        return;
16683                                      }
16684                                      DataType dt =
16685                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16686                                      if (dt.Is(kDataTypeValueInvalid)) {
16687                                        UnallocatedT32(instr);
16688                                        return;
16689                                      }
16690                                      DecodeNeonAndAlign decode_neon =
16691                                          Align_index_align_3_Decode((instr >>
16692                                                                      4) &
16693                                                                         0xf,
16694                                                                     dt);
16695                                      if (!decode_neon.IsValid()) {
16696                                        UnallocatedT32(instr);
16697                                        return;
16698                                      }
16699                                      Alignment align = decode_neon.GetAlign();
16700                                      int lane = decode_neon.GetLane();
16701                                      SpacingType spacing =
16702                                          decode_neon.GetSpacing();
16703                                      unsigned first =
16704                                          ExtractDRegister(instr, 22, 12);
16705                                      unsigned length = 4;
16706                                      unsigned last =
16707                                          first +
16708                                          (length - 1) *
16709                                              (spacing == kSingle ? 1 : 2);
16710                                      unsigned rn = (instr >> 16) & 0xf;
16711                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16712                                      vld4(CurrentCond(),
16713                                           dt,
16714                                           NeonRegisterList(DRegister(first),
16715                                                            DRegister(last),
16716                                                            spacing,
16717                                                            lane),
16718                                           AlignedMemOperand(Register(rn),
16719                                                             align,
16720                                                             PostIndex));
16721                                      break;
16722                                    }
16723                                    case 0x00000002: {
16724                                      // 0xf9a0030f
16725                                      if (((instr & 0xc00) == 0xc00)) {
16726                                        UnallocatedT32(instr);
16727                                        return;
16728                                      }
16729                                      DataType dt =
16730                                          Dt_size_7_Decode((instr >> 10) & 0x3);
16731                                      if (dt.Is(kDataTypeValueInvalid)) {
16732                                        UnallocatedT32(instr);
16733                                        return;
16734                                      }
16735                                      DecodeNeonAndAlign decode_neon =
16736                                          Align_index_align_3_Decode((instr >>
16737                                                                      4) &
16738                                                                         0xf,
16739                                                                     dt);
16740                                      if (!decode_neon.IsValid()) {
16741                                        UnallocatedT32(instr);
16742                                        return;
16743                                      }
16744                                      Alignment align = decode_neon.GetAlign();
16745                                      int lane = decode_neon.GetLane();
16746                                      SpacingType spacing =
16747                                          decode_neon.GetSpacing();
16748                                      unsigned first =
16749                                          ExtractDRegister(instr, 22, 12);
16750                                      unsigned length = 4;
16751                                      unsigned last =
16752                                          first +
16753                                          (length - 1) *
16754                                              (spacing == kSingle ? 1 : 2);
16755                                      unsigned rn = (instr >> 16) & 0xf;
16756                                      // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16757                                      vld4(CurrentCond(),
16758                                           dt,
16759                                           NeonRegisterList(DRegister(first),
16760                                                            DRegister(last),
16761                                                            spacing,
16762                                                            lane),
16763                                           AlignedMemOperand(Register(rn),
16764                                                             align,
16765                                                             Offset));
16766                                      break;
16767                                    }
16768                                  }
16769                                  break;
16770                                }
16771                                default: {
16772                                  if (((instr & 0xc00) == 0xc00) ||
16773                                      ((instr & 0xd) == 0xd)) {
16774                                    UnallocatedT32(instr);
16775                                    return;
16776                                  }
16777                                  DataType dt =
16778                                      Dt_size_7_Decode((instr >> 10) & 0x3);
16779                                  if (dt.Is(kDataTypeValueInvalid)) {
16780                                    UnallocatedT32(instr);
16781                                    return;
16782                                  }
16783                                  DecodeNeonAndAlign decode_neon =
16784                                      Align_index_align_3_Decode((instr >> 4) &
16785                                                                     0xf,
16786                                                                 dt);
16787                                  if (!decode_neon.IsValid()) {
16788                                    UnallocatedT32(instr);
16789                                    return;
16790                                  }
16791                                  Alignment align = decode_neon.GetAlign();
16792                                  int lane = decode_neon.GetLane();
16793                                  SpacingType spacing =
16794                                      decode_neon.GetSpacing();
16795                                  unsigned first =
16796                                      ExtractDRegister(instr, 22, 12);
16797                                  unsigned length = 4;
16798                                  unsigned last =
16799                                      first +
16800                                      (length - 1) *
16801                                          (spacing == kSingle ? 1 : 2);
16802                                  unsigned rn = (instr >> 16) & 0xf;
16803                                  unsigned rm = instr & 0xf;
16804                                  // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16805                                  vld4(CurrentCond(),
16806                                       dt,
16807                                       NeonRegisterList(DRegister(first),
16808                                                        DRegister(last),
16809                                                        spacing,
16810                                                        lane),
16811                                       AlignedMemOperand(Register(rn),
16812                                                         align,
16813                                                         Register(rm),
16814                                                         PostIndex));
16815                                  break;
16816                                }
16817                              }
16818                              break;
16819                            }
16820                          }
16821                          break;
16822                        }
16823                      }
16824                      break;
16825                    }
16826                  }
16827                  break;
16828                }
16829                case 0x10100000: {
16830                  // 0xf8100000
16831                  switch (instr & 0x01400000) {
16832                    case 0x00000000: {
16833                      // 0xf8100000
16834                      switch (instr & 0x000f0000) {
16835                        case 0x000f0000: {
16836                          // 0xf81f0000
16837                          switch (instr & 0x0000f000) {
16838                            case 0x0000f000: {
16839                              // 0xf81ff000
16840                              uint32_t U = (instr >> 23) & 0x1;
16841                              int32_t imm = instr & 0xfff;
16842                              if (U == 0) imm = -imm;
16843                              bool minus_zero = (imm == 0) && (U == 0);
16844                              Location location(imm, kT32PcDelta);
16845                              // PLD{<c>}{<q>} <label> ; T1
16846                              if (minus_zero) {
16847                                pld(CurrentCond(), MemOperand(pc, minus, 0));
16848                              } else {
16849                                pld(CurrentCond(), &location);
16850                              }
16851                              if (((instr & 0xff7ff000) != 0xf81ff000)) {
16852                                UnpredictableT32(instr);
16853                              }
16854                              break;
16855                            }
16856                            default: {
16857                              switch (instr & 0x00200000) {
16858                                case 0x00000000: {
16859                                  // 0xf81f0000
16860                                  if (((instr & 0xf000) == 0xf000)) {
16861                                    UnallocatedT32(instr);
16862                                    return;
16863                                  }
16864                                  unsigned rt = (instr >> 12) & 0xf;
16865                                  uint32_t U = (instr >> 23) & 0x1;
16866                                  int32_t imm = instr & 0xfff;
16867                                  if (U == 0) imm = -imm;
16868                                  bool minus_zero = (imm == 0) && (U == 0);
16869                                  Location location(imm, kT32PcDelta);
16870                                  // LDRB{<c>}{<q>} <Rt>, <label> ; T1
16871                                  if (minus_zero) {
16872                                    ldrb(CurrentCond(),
16873                                         Best,
16874                                         Register(rt),
16875                                         MemOperand(pc, minus, 0));
16876                                  } else {
16877                                    ldrb(CurrentCond(),
16878                                         Register(rt),
16879                                         &location);
16880                                  }
16881                                  break;
16882                                }
16883                                case 0x00200000: {
16884                                  // 0xf83f0000
16885                                  if (((instr & 0xf000) == 0xf000)) {
16886                                    UnallocatedT32(instr);
16887                                    return;
16888                                  }
16889                                  unsigned rt = (instr >> 12) & 0xf;
16890                                  uint32_t U = (instr >> 23) & 0x1;
16891                                  int32_t imm = instr & 0xfff;
16892                                  if (U == 0) imm = -imm;
16893                                  bool minus_zero = (imm == 0) && (U == 0);
16894                                  Location location(imm, kT32PcDelta);
16895                                  // LDRH{<c>}{<q>} <Rt>, <label> ; T1
16896                                  if (minus_zero) {
16897                                    ldrh(CurrentCond(),
16898                                         Best,
16899                                         Register(rt),
16900                                         MemOperand(pc, minus, 0));
16901                                  } else {
16902                                    ldrh(CurrentCond(),
16903                                         Register(rt),
16904                                         &location);
16905                                  }
16906                                  break;
16907                                }
16908                              }
16909                              break;
16910                            }
16911                          }
16912                          break;
16913                        }
16914                        default: {
16915                          switch (instr & 0x00a00000) {
16916                            case 0x00000000: {
16917                              // 0xf8100000
16918                              switch (instr & 0x00000d00) {
16919                                case 0x00000000: {
16920                                  // 0xf8100000
16921                                  switch (instr & 0x000002c0) {
16922                                    case 0x00000000: {
16923                                      // 0xf8100000
16924                                      switch (instr & 0x0000f000) {
16925                                        case 0x0000f000: {
16926                                          // 0xf810f000
16927                                          if (((instr & 0xf0000) == 0xf0000)) {
16928                                            UnallocatedT32(instr);
16929                                            return;
16930                                          }
16931                                          unsigned rn = (instr >> 16) & 0xf;
16932                                          Sign sign(plus);
16933                                          unsigned rm = instr & 0xf;
16934                                          Shift shift = LSL;
16935                                          uint32_t amount = (instr >> 4) & 0x3;
16936                                          AddrMode addrmode = Offset;
16937                                          // PLD{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
16938                                          pld(CurrentCond(),
16939                                              MemOperand(Register(rn),
16940                                                         sign,
16941                                                         Register(rm),
16942                                                         shift,
16943                                                         amount,
16944                                                         addrmode));
16945                                          break;
16946                                        }
16947                                        default: {
16948                                          if (((instr & 0xf0000) == 0xf0000) ||
16949                                              ((instr & 0xf000) == 0xf000)) {
16950                                            UnallocatedT32(instr);
16951                                            return;
16952                                          }
16953                                          unsigned rt = (instr >> 12) & 0xf;
16954                                          unsigned rn = (instr >> 16) & 0xf;
16955                                          Sign sign(plus);
16956                                          unsigned rm = instr & 0xf;
16957                                          Shift shift = LSL;
16958                                          uint32_t amount = (instr >> 4) & 0x3;
16959                                          AddrMode addrmode = Offset;
16960                                          if ((rt < kNumberOfT32LowRegisters) &&
16961                                              (rn < kNumberOfT32LowRegisters) &&
16962                                              (rm < kNumberOfT32LowRegisters) &&
16963                                              shift.IsLSL() && (amount == 0) &&
16964                                              sign.IsPlus()) {
16965                                            // LDRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
16966                                            ldrb(CurrentCond(),
16967                                                 Wide,
16968                                                 Register(rt),
16969                                                 MemOperand(Register(rn),
16970                                                            sign,
16971                                                            Register(rm),
16972                                                            addrmode));
16973                                          } else {
16974                                            // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
16975                                            ldrb(CurrentCond(),
16976                                                 Best,
16977                                                 Register(rt),
16978                                                 MemOperand(Register(rn),
16979                                                            sign,
16980                                                            Register(rm),
16981                                                            shift,
16982                                                            amount,
16983                                                            addrmode));
16984                                          }
16985                                          break;
16986                                        }
16987                                      }
16988                                      break;
16989                                    }
16990                                    default:
16991                                      UnallocatedT32(instr);
16992                                      break;
16993                                  }
16994                                  break;
16995                                }
16996                                case 0x00000900: {
16997                                  // 0xf8100900
16998                                  if (((instr & 0xf0000) == 0xf0000)) {
16999                                    UnallocatedT32(instr);
17000                                    return;
17001                                  }
17002                                  unsigned rt = (instr >> 12) & 0xf;
17003                                  unsigned rn = (instr >> 16) & 0xf;
17004                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17005                                                                        : plus);
17006                                  int32_t offset = instr & 0xff;
17007                                  // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
17008                                  ldrb(CurrentCond(),
17009                                       Best,
17010                                       Register(rt),
17011                                       MemOperand(Register(rn),
17012                                                  sign,
17013                                                  offset,
17014                                                  PostIndex));
17015                                  break;
17016                                }
17017                                case 0x00000c00: {
17018                                  // 0xf8100c00
17019                                  switch (instr & 0x00000200) {
17020                                    case 0x00000000: {
17021                                      // 0xf8100c00
17022                                      switch (instr & 0x0000f000) {
17023                                        case 0x0000f000: {
17024                                          // 0xf810fc00
17025                                          if (((instr & 0xf0000) == 0xf0000)) {
17026                                            UnallocatedT32(instr);
17027                                            return;
17028                                          }
17029                                          unsigned rn = (instr >> 16) & 0xf;
17030                                          int32_t offset = instr & 0xff;
17031                                          // PLD{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17032                                          pld(CurrentCond(),
17033                                              MemOperand(Register(rn),
17034                                                         minus,
17035                                                         offset,
17036                                                         Offset));
17037                                          break;
17038                                        }
17039                                        default: {
17040                                          if (((instr & 0xf0000) == 0xf0000) ||
17041                                              ((instr & 0xf000) == 0xf000)) {
17042                                            UnallocatedT32(instr);
17043                                            return;
17044                                          }
17045                                          unsigned rt = (instr >> 12) & 0xf;
17046                                          unsigned rn = (instr >> 16) & 0xf;
17047                                          int32_t offset = instr & 0xff;
17048                                          // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
17049                                          ldrb(CurrentCond(),
17050                                               Best,
17051                                               Register(rt),
17052                                               MemOperand(Register(rn),
17053                                                          minus,
17054                                                          offset,
17055                                                          Offset));
17056                                          break;
17057                                        }
17058                                      }
17059                                      break;
17060                                    }
17061                                    case 0x00000200: {
17062                                      // 0xf8100e00
17063                                      if (((instr & 0xf0000) == 0xf0000)) {
17064                                        UnallocatedT32(instr);
17065                                        return;
17066                                      }
17067                                      UnimplementedT32_32("LDRBT", instr);
17068                                      break;
17069                                    }
17070                                  }
17071                                  break;
17072                                }
17073                                case 0x00000d00: {
17074                                  // 0xf8100d00
17075                                  if (((instr & 0xf0000) == 0xf0000)) {
17076                                    UnallocatedT32(instr);
17077                                    return;
17078                                  }
17079                                  unsigned rt = (instr >> 12) & 0xf;
17080                                  unsigned rn = (instr >> 16) & 0xf;
17081                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17082                                                                        : plus);
17083                                  int32_t offset = instr & 0xff;
17084                                  // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
17085                                  ldrb(CurrentCond(),
17086                                       Best,
17087                                       Register(rt),
17088                                       MemOperand(Register(rn),
17089                                                  sign,
17090                                                  offset,
17091                                                  PreIndex));
17092                                  break;
17093                                }
17094                                default:
17095                                  UnallocatedT32(instr);
17096                                  break;
17097                              }
17098                              break;
17099                            }
17100                            case 0x00200000: {
17101                              // 0xf8300000
17102                              switch (instr & 0x00000d00) {
17103                                case 0x00000000: {
17104                                  // 0xf8300000
17105                                  switch (instr & 0x000002c0) {
17106                                    case 0x00000000: {
17107                                      // 0xf8300000
17108                                      switch (instr & 0x0000f000) {
17109                                        case 0x0000f000: {
17110                                          // 0xf830f000
17111                                          if (((instr & 0xf0000) == 0xf0000)) {
17112                                            UnallocatedT32(instr);
17113                                            return;
17114                                          }
17115                                          unsigned rn = (instr >> 16) & 0xf;
17116                                          Sign sign(plus);
17117                                          unsigned rm = instr & 0xf;
17118                                          Shift shift = LSL;
17119                                          uint32_t amount = (instr >> 4) & 0x3;
17120                                          AddrMode addrmode = Offset;
17121                                          // PLDW{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
17122                                          pldw(CurrentCond(),
17123                                               MemOperand(Register(rn),
17124                                                          sign,
17125                                                          Register(rm),
17126                                                          shift,
17127                                                          amount,
17128                                                          addrmode));
17129                                          break;
17130                                        }
17131                                        default: {
17132                                          if (((instr & 0xf0000) == 0xf0000) ||
17133                                              ((instr & 0xf000) == 0xf000)) {
17134                                            UnallocatedT32(instr);
17135                                            return;
17136                                          }
17137                                          unsigned rt = (instr >> 12) & 0xf;
17138                                          unsigned rn = (instr >> 16) & 0xf;
17139                                          Sign sign(plus);
17140                                          unsigned rm = instr & 0xf;
17141                                          Shift shift = LSL;
17142                                          uint32_t amount = (instr >> 4) & 0x3;
17143                                          AddrMode addrmode = Offset;
17144                                          if ((rt < kNumberOfT32LowRegisters) &&
17145                                              (rn < kNumberOfT32LowRegisters) &&
17146                                              (rm < kNumberOfT32LowRegisters) &&
17147                                              shift.IsLSL() && (amount == 0) &&
17148                                              sign.IsPlus()) {
17149                                            // LDRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17150                                            ldrh(CurrentCond(),
17151                                                 Wide,
17152                                                 Register(rt),
17153                                                 MemOperand(Register(rn),
17154                                                            sign,
17155                                                            Register(rm),
17156                                                            addrmode));
17157                                          } else {
17158                                            // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17159                                            ldrh(CurrentCond(),
17160                                                 Best,
17161                                                 Register(rt),
17162                                                 MemOperand(Register(rn),
17163                                                            sign,
17164                                                            Register(rm),
17165                                                            shift,
17166                                                            amount,
17167                                                            addrmode));
17168                                          }
17169                                          break;
17170                                        }
17171                                      }
17172                                      break;
17173                                    }
17174                                    default:
17175                                      UnallocatedT32(instr);
17176                                      break;
17177                                  }
17178                                  break;
17179                                }
17180                                case 0x00000900: {
17181                                  // 0xf8300900
17182                                  if (((instr & 0xf0000) == 0xf0000)) {
17183                                    UnallocatedT32(instr);
17184                                    return;
17185                                  }
17186                                  unsigned rt = (instr >> 12) & 0xf;
17187                                  unsigned rn = (instr >> 16) & 0xf;
17188                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17189                                                                        : plus);
17190                                  int32_t offset = instr & 0xff;
17191                                  // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
17192                                  ldrh(CurrentCond(),
17193                                       Best,
17194                                       Register(rt),
17195                                       MemOperand(Register(rn),
17196                                                  sign,
17197                                                  offset,
17198                                                  PostIndex));
17199                                  break;
17200                                }
17201                                case 0x00000c00: {
17202                                  // 0xf8300c00
17203                                  switch (instr & 0x00000200) {
17204                                    case 0x00000000: {
17205                                      // 0xf8300c00
17206                                      switch (instr & 0x0000f000) {
17207                                        case 0x0000f000: {
17208                                          // 0xf830fc00
17209                                          if (((instr & 0xf0000) == 0xf0000)) {
17210                                            UnallocatedT32(instr);
17211                                            return;
17212                                          }
17213                                          unsigned rn = (instr >> 16) & 0xf;
17214                                          int32_t offset = instr & 0xff;
17215                                          // PLDW{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17216                                          pldw(CurrentCond(),
17217                                               MemOperand(Register(rn),
17218                                                          minus,
17219                                                          offset,
17220                                                          Offset));
17221                                          break;
17222                                        }
17223                                        default: {
17224                                          if (((instr & 0xf0000) == 0xf0000) ||
17225                                              ((instr & 0xf000) == 0xf000)) {
17226                                            UnallocatedT32(instr);
17227                                            return;
17228                                          }
17229                                          unsigned rt = (instr >> 12) & 0xf;
17230                                          unsigned rn = (instr >> 16) & 0xf;
17231                                          int32_t offset = instr & 0xff;
17232                                          // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
17233                                          ldrh(CurrentCond(),
17234                                               Best,
17235                                               Register(rt),
17236                                               MemOperand(Register(rn),
17237                                                          minus,
17238                                                          offset,
17239                                                          Offset));
17240                                          break;
17241                                        }
17242                                      }
17243                                      break;
17244                                    }
17245                                    case 0x00000200: {
17246                                      // 0xf8300e00
17247                                      if (((instr & 0xf0000) == 0xf0000)) {
17248                                        UnallocatedT32(instr);
17249                                        return;
17250                                      }
17251                                      UnimplementedT32_32("LDRHT", instr);
17252                                      break;
17253                                    }
17254                                  }
17255                                  break;
17256                                }
17257                                case 0x00000d00: {
17258                                  // 0xf8300d00
17259                                  if (((instr & 0xf0000) == 0xf0000)) {
17260                                    UnallocatedT32(instr);
17261                                    return;
17262                                  }
17263                                  unsigned rt = (instr >> 12) & 0xf;
17264                                  unsigned rn = (instr >> 16) & 0xf;
17265                                  Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17266                                                                        : plus);
17267                                  int32_t offset = instr & 0xff;
17268                                  // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
17269                                  ldrh(CurrentCond(),
17270                                       Best,
17271                                       Register(rt),
17272                                       MemOperand(Register(rn),
17273                                                  sign,
17274                                                  offset,
17275                                                  PreIndex));
17276                                  break;
17277                                }
17278                                default:
17279                                  UnallocatedT32(instr);
17280                                  break;
17281                              }
17282                              break;
17283                            }
17284                            case 0x00800000: {
17285                              // 0xf8900000
17286                              switch (instr & 0x0000f000) {
17287                                case 0x0000f000: {
17288                                  // 0xf890f000
17289                                  if (((instr & 0xf0000) == 0xf0000)) {
17290                                    UnallocatedT32(instr);
17291                                    return;
17292                                  }
17293                                  unsigned rn = (instr >> 16) & 0xf;
17294                                  int32_t offset = instr & 0xfff;
17295                                  // PLD{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17296                                  pld(CurrentCond(),
17297                                      MemOperand(Register(rn),
17298                                                 plus,
17299                                                 offset,
17300                                                 Offset));
17301                                  break;
17302                                }
17303                                default: {
17304                                  if (((instr & 0xf0000) == 0xf0000) ||
17305                                      ((instr & 0xf000) == 0xf000)) {
17306                                    UnallocatedT32(instr);
17307                                    return;
17308                                  }
17309                                  unsigned rt = (instr >> 12) & 0xf;
17310                                  unsigned rn = (instr >> 16) & 0xf;
17311                                  int32_t offset = instr & 0xfff;
17312                                  if ((rt < kNumberOfT32LowRegisters) &&
17313                                      (rn < kNumberOfT32LowRegisters) &&
17314                                      ((offset >= 0) && (offset <= 31))) {
17315                                    // LDRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17316                                    ldrb(CurrentCond(),
17317                                         Wide,
17318                                         Register(rt),
17319                                         MemOperand(Register(rn),
17320                                                    plus,
17321                                                    offset,
17322                                                    Offset));
17323                                  } else {
17324                                    // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17325                                    ldrb(CurrentCond(),
17326                                         Best,
17327                                         Register(rt),
17328                                         MemOperand(Register(rn),
17329                                                    plus,
17330                                                    offset,
17331                                                    Offset));
17332                                  }
17333                                  break;
17334                                }
17335                              }
17336                              break;
17337                            }
17338                            case 0x00a00000: {
17339                              // 0xf8b00000
17340                              switch (instr & 0x0000f000) {
17341                                case 0x0000f000: {
17342                                  // 0xf8b0f000
17343                                  if (((instr & 0xf0000) == 0xf0000)) {
17344                                    UnallocatedT32(instr);
17345                                    return;
17346                                  }
17347                                  unsigned rn = (instr >> 16) & 0xf;
17348                                  int32_t offset = instr & 0xfff;
17349                                  // PLDW{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17350                                  pldw(CurrentCond(),
17351                                       MemOperand(Register(rn),
17352                                                  plus,
17353                                                  offset,
17354                                                  Offset));
17355                                  break;
17356                                }
17357                                default: {
17358                                  if (((instr & 0xf0000) == 0xf0000) ||
17359                                      ((instr & 0xf000) == 0xf000)) {
17360                                    UnallocatedT32(instr);
17361                                    return;
17362                                  }
17363                                  unsigned rt = (instr >> 12) & 0xf;
17364                                  unsigned rn = (instr >> 16) & 0xf;
17365                                  int32_t offset = instr & 0xfff;
17366                                  if ((rt < kNumberOfT32LowRegisters) &&
17367                                      (rn < kNumberOfT32LowRegisters) &&
17368                                      ((offset >= 0) && (offset <= 62) &&
17369                                       ((offset & 1) == 0))) {
17370                                    // LDRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17371                                    ldrh(CurrentCond(),
17372                                         Wide,
17373                                         Register(rt),
17374                                         MemOperand(Register(rn),
17375                                                    plus,
17376                                                    offset,
17377                                                    Offset));
17378                                  } else {
17379                                    // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17380                                    ldrh(CurrentCond(),
17381                                         Best,
17382                                         Register(rt),
17383                                         MemOperand(Register(rn),
17384                                                    plus,
17385                                                    offset,
17386                                                    Offset));
17387                                  }
17388                                  break;
17389                                }
17390                              }
17391                              break;
17392                            }
17393                          }
17394                          break;
17395                        }
17396                      }
17397                      break;
17398                    }
17399                    case 0x00400000: {
17400                      // 0xf8500000
17401                      switch (instr & 0x00200000) {
17402                        case 0x00000000: {
17403                          // 0xf8500000
17404                          switch (instr & 0x000f0000) {
17405                            case 0x000f0000: {
17406                              // 0xf85f0000
17407                              unsigned rt = (instr >> 12) & 0xf;
17408                              uint32_t U = (instr >> 23) & 0x1;
17409                              int32_t imm = instr & 0xfff;
17410                              if (U == 0) imm = -imm;
17411                              bool minus_zero = (imm == 0) && (U == 0);
17412                              Location location(imm, kT32PcDelta);
17413                              if ((imm >= -4095) && (imm <= 4095) &&
17414                                  ((rt < kNumberOfT32LowRegisters) &&
17415                                   (imm >= 0) && (imm <= 1020) &&
17416                                   ((imm & 3) == 0))) {
17417                                // LDR{<c>}.W <Rt>, <label> ; T2
17418                                if (minus_zero) {
17419                                  ldr(CurrentCond(),
17420                                      Wide,
17421                                      Register(rt),
17422                                      MemOperand(pc, minus, 0));
17423                                } else {
17424                                  ldr(CurrentCond(),
17425                                      Wide,
17426                                      Register(rt),
17427                                      &location);
17428                                }
17429                              } else if ((imm >= -4095) && (imm <= 4095)) {
17430                                // LDR{<c>}{<q>} <Rt>, <label> ; T2
17431                                if (minus_zero) {
17432                                  ldr(CurrentCond(),
17433                                      Best,
17434                                      Register(rt),
17435                                      MemOperand(pc, minus, 0));
17436                                } else {
17437                                  ldr(CurrentCond(),
17438                                      Best,
17439                                      Register(rt),
17440                                      &location);
17441                                }
17442                              } else {
17443                                UnallocatedT32(instr);
17444                              }
17445                              break;
17446                            }
17447                            default: {
17448                              switch (instr & 0x00800000) {
17449                                case 0x00000000: {
17450                                  // 0xf8500000
17451                                  switch (instr & 0x00000d00) {
17452                                    case 0x00000000: {
17453                                      // 0xf8500000
17454                                      if ((instr & 0x000002c0) == 0x00000000) {
17455                                        if (((instr & 0xf0000) == 0xf0000)) {
17456                                          UnallocatedT32(instr);
17457                                          return;
17458                                        }
17459                                        unsigned rt = (instr >> 12) & 0xf;
17460                                        unsigned rn = (instr >> 16) & 0xf;
17461                                        Sign sign(plus);
17462                                        unsigned rm = instr & 0xf;
17463                                        Shift shift = LSL;
17464                                        uint32_t amount = (instr >> 4) & 0x3;
17465                                        AddrMode addrmode = Offset;
17466                                        if ((rt < kNumberOfT32LowRegisters) &&
17467                                            (rn < kNumberOfT32LowRegisters) &&
17468                                            (rm < kNumberOfT32LowRegisters) &&
17469                                            shift.IsLSL() && (amount == 0) &&
17470                                            sign.IsPlus()) {
17471                                          // LDR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17472                                          ldr(CurrentCond(),
17473                                              Wide,
17474                                              Register(rt),
17475                                              MemOperand(Register(rn),
17476                                                         sign,
17477                                                         Register(rm),
17478                                                         addrmode));
17479                                        } else {
17480                                          // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17481                                          ldr(CurrentCond(),
17482                                              Best,
17483                                              Register(rt),
17484                                              MemOperand(Register(rn),
17485                                                         sign,
17486                                                         Register(rm),
17487                                                         shift,
17488                                                         amount,
17489                                                         addrmode));
17490                                        }
17491                                      } else {
17492                                        UnallocatedT32(instr);
17493                                      }
17494                                      break;
17495                                    }
17496                                    case 0x00000900: {
17497                                      // 0xf8500900
17498                                      if (((instr & 0xf0000) == 0xf0000)) {
17499                                        UnallocatedT32(instr);
17500                                        return;
17501                                      }
17502                                      if (((Uint32((instr >> 16)) &
17503                                            Uint32(0xf)) == Uint32(0xd)) &&
17504                                          ((Uint32((instr >> 9)) &
17505                                            Uint32(0x1)) == Uint32(0x1)) &&
17506                                          ((Uint32(instr) & Uint32(0xff)) ==
17507                                           Uint32(0x4))) {
17508                                        unsigned rt = (instr >> 12) & 0xf;
17509                                        if ((rt <= 7) || (rt == kPCRegNum)) {
17510                                          // POP{<c>}.W <single_register_list> ; T4 NOLINT(whitespace/line_length)
17511                                          pop(CurrentCond(),
17512                                              Wide,
17513                                              Register(rt));
17514                                        } else {
17515                                          // POP{<c>}{<q>} <single_register_list> ; T4 NOLINT(whitespace/line_length)
17516                                          pop(CurrentCond(),
17517                                              Best,
17518                                              Register(rt));
17519                                        }
17520                                        return;
17521                                      }
17522                                      unsigned rt = (instr >> 12) & 0xf;
17523                                      unsigned rn = (instr >> 16) & 0xf;
17524                                      Sign sign((((instr >> 9) & 0x1) == 0)
17525                                                    ? minus
17526                                                    : plus);
17527                                      int32_t offset = instr & 0xff;
17528                                      // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 NOLINT(whitespace/line_length)
17529                                      ldr(CurrentCond(),
17530                                          Best,
17531                                          Register(rt),
17532                                          MemOperand(Register(rn),
17533                                                     sign,
17534                                                     offset,
17535                                                     PostIndex));
17536                                      break;
17537                                    }
17538                                    case 0x00000c00: {
17539                                      // 0xf8500c00
17540                                      switch (instr & 0x00000200) {
17541                                        case 0x00000000: {
17542                                          // 0xf8500c00
17543                                          if (((instr & 0xf0000) == 0xf0000)) {
17544                                            UnallocatedT32(instr);
17545                                            return;
17546                                          }
17547                                          unsigned rt = (instr >> 12) & 0xf;
17548                                          unsigned rn = (instr >> 16) & 0xf;
17549                                          int32_t offset = instr & 0xff;
17550                                          // LDR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 NOLINT(whitespace/line_length)
17551                                          ldr(CurrentCond(),
17552                                              Best,
17553                                              Register(rt),
17554                                              MemOperand(Register(rn),
17555                                                         minus,
17556                                                         offset,
17557                                                         Offset));
17558                                          break;
17559                                        }
17560                                        case 0x00000200: {
17561                                          // 0xf8500e00
17562                                          if (((instr & 0xf0000) == 0xf0000)) {
17563                                            UnallocatedT32(instr);
17564                                            return;
17565                                          }
17566                                          UnimplementedT32_32("LDRT", instr);
17567                                          break;
17568                                        }
17569                                      }
17570                                      break;
17571                                    }
17572                                    case 0x00000d00: {
17573                                      // 0xf8500d00
17574                                      if (((instr & 0xf0000) == 0xf0000)) {
17575                                        UnallocatedT32(instr);
17576                                        return;
17577                                      }
17578                                      unsigned rt = (instr >> 12) & 0xf;
17579                                      unsigned rn = (instr >> 16) & 0xf;
17580                                      Sign sign((((instr >> 9) & 0x1) == 0)
17581                                                    ? minus
17582                                                    : plus);
17583                                      int32_t offset = instr & 0xff;
17584                                      // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 NOLINT(whitespace/line_length)
17585                                      ldr(CurrentCond(),
17586                                          Best,
17587                                          Register(rt),
17588                                          MemOperand(Register(rn),
17589                                                     sign,
17590                                                     offset,
17591                                                     PreIndex));
17592                                      break;
17593                                    }
17594                                    default:
17595                                      UnallocatedT32(instr);
17596                                      break;
17597                                  }
17598                                  break;
17599                                }
17600                                case 0x00800000: {
17601                                  // 0xf8d00000
17602                                  if (((instr & 0xf0000) == 0xf0000)) {
17603                                    UnallocatedT32(instr);
17604                                    return;
17605                                  }
17606                                  unsigned rt = (instr >> 12) & 0xf;
17607                                  unsigned rn = (instr >> 16) & 0xf;
17608                                  int32_t offset = instr & 0xfff;
17609                                  if (((rt < kNumberOfT32LowRegisters) &&
17610                                       (rn < kNumberOfT32LowRegisters) &&
17611                                       ((offset >= 0) && (offset <= 124) &&
17612                                        ((offset & 3) == 0))) ||
17613                                      ((rt < kNumberOfT32LowRegisters) &&
17614                                       (rn == sp.GetCode()) &&
17615                                       ((offset >= 0) && (offset <= 1020) &&
17616                                        ((offset & 3) == 0)))) {
17617                                    // LDR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
17618                                    ldr(CurrentCond(),
17619                                        Wide,
17620                                        Register(rt),
17621                                        MemOperand(Register(rn),
17622                                                   plus,
17623                                                   offset,
17624                                                   Offset));
17625                                  } else {
17626                                    // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
17627                                    ldr(CurrentCond(),
17628                                        Best,
17629                                        Register(rt),
17630                                        MemOperand(Register(rn),
17631                                                   plus,
17632                                                   offset,
17633                                                   Offset));
17634                                  }
17635                                  break;
17636                                }
17637                              }
17638                              break;
17639                            }
17640                          }
17641                          break;
17642                        }
17643                        default:
17644                          UnallocatedT32(instr);
17645                          break;
17646                      }
17647                      break;
17648                    }
17649                    case 0x01000000: {
17650                      // 0xf9100000
17651                      switch (instr & 0x00200000) {
17652                        case 0x00000000: {
17653                          // 0xf9100000
17654                          switch (instr & 0x000f0000) {
17655                            case 0x000f0000: {
17656                              // 0xf91f0000
17657                              switch (instr & 0x0000f000) {
17658                                case 0x0000f000: {
17659                                  // 0xf91ff000
17660                                  uint32_t U = (instr >> 23) & 0x1;
17661                                  int32_t imm = instr & 0xfff;
17662                                  if (U == 0) imm = -imm;
17663                                  bool minus_zero = (imm == 0) && (U == 0);
17664                                  Location location(imm, kT32PcDelta);
17665                                  // PLI{<c>}{<q>} <label> ; T3
17666                                  if (minus_zero) {
17667                                    pli(CurrentCond(),
17668                                        MemOperand(pc, minus, 0));
17669                                  } else {
17670                                    pli(CurrentCond(), &location);
17671                                  }
17672                                  break;
17673                                }
17674                                default: {
17675                                  if (((instr & 0xf000) == 0xf000)) {
17676                                    UnallocatedT32(instr);
17677                                    return;
17678                                  }
17679                                  unsigned rt = (instr >> 12) & 0xf;
17680                                  uint32_t U = (instr >> 23) & 0x1;
17681                                  int32_t imm = instr & 0xfff;
17682                                  if (U == 0) imm = -imm;
17683                                  bool minus_zero = (imm == 0) && (U == 0);
17684                                  Location location(imm, kT32PcDelta);
17685                                  // LDRSB{<c>}{<q>} <Rt>, <label> ; T1
17686                                  if (minus_zero) {
17687                                    ldrsb(CurrentCond(),
17688                                          Best,
17689                                          Register(rt),
17690                                          MemOperand(pc, minus, 0));
17691                                  } else {
17692                                    ldrsb(CurrentCond(),
17693                                          Register(rt),
17694                                          &location);
17695                                  }
17696                                  break;
17697                                }
17698                              }
17699                              break;
17700                            }
17701                            default: {
17702                              switch (instr & 0x00800000) {
17703                                case 0x00000000: {
17704                                  // 0xf9100000
17705                                  switch (instr & 0x00000d00) {
17706                                    case 0x00000000: {
17707                                      // 0xf9100000
17708                                      switch (instr & 0x000002c0) {
17709                                        case 0x00000000: {
17710                                          // 0xf9100000
17711                                          switch (instr & 0x0000f000) {
17712                                            case 0x0000f000: {
17713                                              // 0xf910f000
17714                                              if (((instr & 0xf0000) ==
17715                                                   0xf0000)) {
17716                                                UnallocatedT32(instr);
17717                                                return;
17718                                              }
17719                                              unsigned rn = (instr >> 16) & 0xf;
17720                                              Sign sign(plus);
17721                                              unsigned rm = instr & 0xf;
17722                                              Shift shift = LSL;
17723                                              uint32_t amount =
17724                                                  (instr >> 4) & 0x3;
17725                                              AddrMode addrmode = Offset;
17726                                              // PLI{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
17727                                              pli(CurrentCond(),
17728                                                  MemOperand(Register(rn),
17729                                                             sign,
17730                                                             Register(rm),
17731                                                             shift,
17732                                                             amount,
17733                                                             addrmode));
17734                                              break;
17735                                            }
17736                                            default: {
17737                                              if (((instr & 0xf0000) ==
17738                                                   0xf0000) ||
17739                                                  ((instr & 0xf000) ==
17740                                                   0xf000)) {
17741                                                UnallocatedT32(instr);
17742                                                return;
17743                                              }
17744                                              unsigned rt = (instr >> 12) & 0xf;
17745                                              unsigned rn = (instr >> 16) & 0xf;
17746                                              Sign sign(plus);
17747                                              unsigned rm = instr & 0xf;
17748                                              Shift shift = LSL;
17749                                              uint32_t amount =
17750                                                  (instr >> 4) & 0x3;
17751                                              AddrMode addrmode = Offset;
17752                                              if ((rt <
17753                                                   kNumberOfT32LowRegisters) &&
17754                                                  (rn <
17755                                                   kNumberOfT32LowRegisters) &&
17756                                                  (rm <
17757                                                   kNumberOfT32LowRegisters) &&
17758                                                  shift.IsLSL() &&
17759                                                  (amount == 0) &&
17760                                                  sign.IsPlus()) {
17761                                                // LDRSB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17762                                                ldrsb(CurrentCond(),
17763                                                      Wide,
17764                                                      Register(rt),
17765                                                      MemOperand(Register(rn),
17766                                                                 sign,
17767                                                                 Register(rm),
17768                                                                 addrmode));
17769                                              } else {
17770                                                // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17771                                                ldrsb(CurrentCond(),
17772                                                      Best,
17773                                                      Register(rt),
17774                                                      MemOperand(Register(rn),
17775                                                                 sign,
17776                                                                 Register(rm),
17777                                                                 shift,
17778                                                                 amount,
17779                                                                 addrmode));
17780                                              }
17781                                              break;
17782                                            }
17783                                          }
17784                                          break;
17785                                        }
17786                                        default:
17787                                          UnallocatedT32(instr);
17788                                          break;
17789                                      }
17790                                      break;
17791                                    }
17792                                    case 0x00000900: {
17793                                      // 0xf9100900
17794                                      if (((instr & 0xf0000) == 0xf0000)) {
17795                                        UnallocatedT32(instr);
17796                                        return;
17797                                      }
17798                                      unsigned rt = (instr >> 12) & 0xf;
17799                                      unsigned rn = (instr >> 16) & 0xf;
17800                                      Sign sign((((instr >> 9) & 0x1) == 0)
17801                                                    ? minus
17802                                                    : plus);
17803                                      int32_t offset = instr & 0xff;
17804                                      // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
17805                                      ldrsb(CurrentCond(),
17806                                            Best,
17807                                            Register(rt),
17808                                            MemOperand(Register(rn),
17809                                                       sign,
17810                                                       offset,
17811                                                       PostIndex));
17812                                      break;
17813                                    }
17814                                    case 0x00000c00: {
17815                                      // 0xf9100c00
17816                                      switch (instr & 0x00000200) {
17817                                        case 0x00000000: {
17818                                          // 0xf9100c00
17819                                          switch (instr & 0x0000f000) {
17820                                            case 0x0000f000: {
17821                                              // 0xf910fc00
17822                                              if (((instr & 0xf0000) ==
17823                                                   0xf0000)) {
17824                                                UnallocatedT32(instr);
17825                                                return;
17826                                              }
17827                                              unsigned rn = (instr >> 16) & 0xf;
17828                                              int32_t offset = instr & 0xff;
17829                                              // PLI{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17830                                              pli(CurrentCond(),
17831                                                  MemOperand(Register(rn),
17832                                                             minus,
17833                                                             offset,
17834                                                             Offset));
17835                                              break;
17836                                            }
17837                                            default: {
17838                                              if (((instr & 0xf0000) ==
17839                                                   0xf0000) ||
17840                                                  ((instr & 0xf000) ==
17841                                                   0xf000)) {
17842                                                UnallocatedT32(instr);
17843                                                return;
17844                                              }
17845                                              unsigned rt = (instr >> 12) & 0xf;
17846                                              unsigned rn = (instr >> 16) & 0xf;
17847                                              int32_t offset = instr & 0xff;
17848                                              // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17849                                              ldrsb(CurrentCond(),
17850                                                    Best,
17851                                                    Register(rt),
17852                                                    MemOperand(Register(rn),
17853                                                               minus,
17854                                                               offset,
17855                                                               Offset));
17856                                              break;
17857                                            }
17858                                          }
17859                                          break;
17860                                        }
17861                                        case 0x00000200: {
17862                                          // 0xf9100e00
17863                                          if (((instr & 0xf0000) == 0xf0000)) {
17864                                            UnallocatedT32(instr);
17865                                            return;
17866                                          }
17867                                          UnimplementedT32_32("LDRSBT", instr);
17868                                          break;
17869                                        }
17870                                      }
17871                                      break;
17872                                    }
17873                                    case 0x00000d00: {
17874                                      // 0xf9100d00
17875                                      if (((instr & 0xf0000) == 0xf0000)) {
17876                                        UnallocatedT32(instr);
17877                                        return;
17878                                      }
17879                                      unsigned rt = (instr >> 12) & 0xf;
17880                                      unsigned rn = (instr >> 16) & 0xf;
17881                                      Sign sign((((instr >> 9) & 0x1) == 0)
17882                                                    ? minus
17883                                                    : plus);
17884                                      int32_t offset = instr & 0xff;
17885                                      // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
17886                                      ldrsb(CurrentCond(),
17887                                            Best,
17888                                            Register(rt),
17889                                            MemOperand(Register(rn),
17890                                                       sign,
17891                                                       offset,
17892                                                       PreIndex));
17893                                      break;
17894                                    }
17895                                    default:
17896                                      UnallocatedT32(instr);
17897                                      break;
17898                                  }
17899                                  break;
17900                                }
17901                                case 0x00800000: {
17902                                  // 0xf9900000
17903                                  switch (instr & 0x0000f000) {
17904                                    case 0x0000f000: {
17905                                      // 0xf990f000
17906                                      if (((instr & 0xf0000) == 0xf0000)) {
17907                                        UnallocatedT32(instr);
17908                                        return;
17909                                      }
17910                                      unsigned rn = (instr >> 16) & 0xf;
17911                                      int32_t offset = instr & 0xfff;
17912                                      // PLI{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17913                                      pli(CurrentCond(),
17914                                          MemOperand(Register(rn),
17915                                                     plus,
17916                                                     offset,
17917                                                     Offset));
17918                                      break;
17919                                    }
17920                                    default: {
17921                                      if (((instr & 0xf0000) == 0xf0000) ||
17922                                          ((instr & 0xf000) == 0xf000)) {
17923                                        UnallocatedT32(instr);
17924                                        return;
17925                                      }
17926                                      unsigned rt = (instr >> 12) & 0xf;
17927                                      unsigned rn = (instr >> 16) & 0xf;
17928                                      int32_t offset = instr & 0xfff;
17929                                      // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
17930                                      ldrsb(CurrentCond(),
17931                                            Best,
17932                                            Register(rt),
17933                                            MemOperand(Register(rn),
17934                                                       plus,
17935                                                       offset,
17936                                                       Offset));
17937                                      break;
17938                                    }
17939                                  }
17940                                  break;
17941                                }
17942                              }
17943                              break;
17944                            }
17945                          }
17946                          break;
17947                        }
17948                        case 0x00200000: {
17949                          // 0xf9300000
17950                          switch (instr & 0x000f0000) {
17951                            case 0x000f0000: {
17952                              // 0xf93f0000
17953                              if (((instr & 0xf000) == 0xf000)) {
17954                                UnallocatedT32(instr);
17955                                return;
17956                              }
17957                              unsigned rt = (instr >> 12) & 0xf;
17958                              uint32_t U = (instr >> 23) & 0x1;
17959                              int32_t imm = instr & 0xfff;
17960                              if (U == 0) imm = -imm;
17961                              bool minus_zero = (imm == 0) && (U == 0);
17962                              Location location(imm, kT32PcDelta);
17963                              // LDRSH{<c>}{<q>} <Rt>, <label> ; T1
17964                              if (minus_zero) {
17965                                ldrsh(CurrentCond(),
17966                                      Best,
17967                                      Register(rt),
17968                                      MemOperand(pc, minus, 0));
17969                              } else {
17970                                ldrsh(CurrentCond(), Register(rt), &location);
17971                              }
17972                              break;
17973                            }
17974                            default: {
17975                              switch (instr & 0x00800000) {
17976                                case 0x00000000: {
17977                                  // 0xf9300000
17978                                  switch (instr & 0x00000d00) {
17979                                    case 0x00000000: {
17980                                      // 0xf9300000
17981                                      if ((instr & 0x000002c0) == 0x00000000) {
17982                                        if (((instr & 0xf0000) == 0xf0000) ||
17983                                            ((instr & 0xf000) == 0xf000)) {
17984                                          UnallocatedT32(instr);
17985                                          return;
17986                                        }
17987                                        unsigned rt = (instr >> 12) & 0xf;
17988                                        unsigned rn = (instr >> 16) & 0xf;
17989                                        Sign sign(plus);
17990                                        unsigned rm = instr & 0xf;
17991                                        Shift shift = LSL;
17992                                        uint32_t amount = (instr >> 4) & 0x3;
17993                                        AddrMode addrmode = Offset;
17994                                        if ((rt < kNumberOfT32LowRegisters) &&
17995                                            (rn < kNumberOfT32LowRegisters) &&
17996                                            (rm < kNumberOfT32LowRegisters) &&
17997                                            shift.IsLSL() && (amount == 0) &&
17998                                            sign.IsPlus()) {
17999                                          // LDRSH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
18000                                          ldrsh(CurrentCond(),
18001                                                Wide,
18002                                                Register(rt),
18003                                                MemOperand(Register(rn),
18004                                                           sign,
18005                                                           Register(rm),
18006                                                           addrmode));
18007                                        } else {
18008                                          // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
18009                                          ldrsh(CurrentCond(),
18010                                                Best,
18011                                                Register(rt),
18012                                                MemOperand(Register(rn),
18013                                                           sign,
18014                                                           Register(rm),
18015                                                           shift,
18016                                                           amount,
18017                                                           addrmode));
18018                                        }
18019                                      } else {
18020                                        UnallocatedT32(instr);
18021                                      }
18022                                      break;
18023                                    }
18024                                    case 0x00000900: {
18025                                      // 0xf9300900
18026                                      if (((instr & 0xf0000) == 0xf0000)) {
18027                                        UnallocatedT32(instr);
18028                                        return;
18029                                      }
18030                                      unsigned rt = (instr >> 12) & 0xf;
18031                                      unsigned rn = (instr >> 16) & 0xf;
18032                                      Sign sign((((instr >> 9) & 0x1) == 0)
18033                                                    ? minus
18034                                                    : plus);
18035                                      int32_t offset = instr & 0xff;
18036                                      // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
18037                                      ldrsh(CurrentCond(),
18038                                            Best,
18039                                            Register(rt),
18040                                            MemOperand(Register(rn),
18041                                                       sign,
18042                                                       offset,
18043                                                       PostIndex));
18044                                      break;
18045                                    }
18046                                    case 0x00000c00: {
18047                                      // 0xf9300c00
18048                                      switch (instr & 0x00000200) {
18049                                        case 0x00000000: {
18050                                          // 0xf9300c00
18051                                          if (((instr & 0xf0000) == 0xf0000) ||
18052                                              ((instr & 0xf000) == 0xf000)) {
18053                                            UnallocatedT32(instr);
18054                                            return;
18055                                          }
18056                                          unsigned rt = (instr >> 12) & 0xf;
18057                                          unsigned rn = (instr >> 16) & 0xf;
18058                                          int32_t offset = instr & 0xff;
18059                                          // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
18060                                          ldrsh(CurrentCond(),
18061                                                Best,
18062                                                Register(rt),
18063                                                MemOperand(Register(rn),
18064                                                           minus,
18065                                                           offset,
18066                                                           Offset));
18067                                          break;
18068                                        }
18069                                        case 0x00000200: {
18070                                          // 0xf9300e00
18071                                          if (((instr & 0xf0000) == 0xf0000)) {
18072                                            UnallocatedT32(instr);
18073                                            return;
18074                                          }
18075                                          UnimplementedT32_32("LDRSHT", instr);
18076                                          break;
18077                                        }
18078                                      }
18079                                      break;
18080                                    }
18081                                    case 0x00000d00: {
18082                                      // 0xf9300d00
18083                                      if (((instr & 0xf0000) == 0xf0000)) {
18084                                        UnallocatedT32(instr);
18085                                        return;
18086                                      }
18087                                      unsigned rt = (instr >> 12) & 0xf;
18088                                      unsigned rn = (instr >> 16) & 0xf;
18089                                      Sign sign((((instr >> 9) & 0x1) == 0)
18090                                                    ? minus
18091                                                    : plus);
18092                                      int32_t offset = instr & 0xff;
18093                                      // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
18094                                      ldrsh(CurrentCond(),
18095                                            Best,
18096                                            Register(rt),
18097                                            MemOperand(Register(rn),
18098                                                       sign,
18099                                                       offset,
18100                                                       PreIndex));
18101                                      break;
18102                                    }
18103                                    default:
18104                                      UnallocatedT32(instr);
18105                                      break;
18106                                  }
18107                                  break;
18108                                }
18109                                case 0x00800000: {
18110                                  // 0xf9b00000
18111                                  if (((instr & 0xf0000) == 0xf0000) ||
18112                                      ((instr & 0xf000) == 0xf000)) {
18113                                    UnallocatedT32(instr);
18114                                    return;
18115                                  }
18116                                  unsigned rt = (instr >> 12) & 0xf;
18117                                  unsigned rn = (instr >> 16) & 0xf;
18118                                  int32_t offset = instr & 0xfff;
18119                                  // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
18120                                  ldrsh(CurrentCond(),
18121                                        Best,
18122                                        Register(rt),
18123                                        MemOperand(Register(rn),
18124                                                   plus,
18125                                                   offset,
18126                                                   Offset));
18127                                  break;
18128                                }
18129                              }
18130                              break;
18131                            }
18132                          }
18133                          break;
18134                        }
18135                      }
18136                      break;
18137                    }
18138                    default:
18139                      UnallocatedT32(instr);
18140                      break;
18141                  }
18142                  break;
18143                }
18144              }
18145              break;
18146            }
18147            case 0x02000000: {
18148              // 0xea000000
18149              switch (instr & 0x11900000) {
18150                case 0x00000000: {
18151                  // 0xea000000
18152                  switch (instr & 0x00600000) {
18153                    case 0x00000000: {
18154                      // 0xea000000
18155                      switch (instr & 0x000070f0) {
18156                        case 0x00000030: {
18157                          // 0xea000030
18158                          unsigned rd = (instr >> 8) & 0xf;
18159                          unsigned rn = (instr >> 16) & 0xf;
18160                          unsigned rm = instr & 0xf;
18161                          // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18162                          and_(CurrentCond(),
18163                               Best,
18164                               Register(rd),
18165                               Register(rn),
18166                               Operand(Register(rm), RRX));
18167                          if (((instr & 0xfff0f0f0) != 0xea000030)) {
18168                            UnpredictableT32(instr);
18169                          }
18170                          break;
18171                        }
18172                        default: {
18173                          if (((instr & 0x70f0) == 0x30)) {
18174                            UnallocatedT32(instr);
18175                            return;
18176                          }
18177                          unsigned rd = (instr >> 8) & 0xf;
18178                          unsigned rn = (instr >> 16) & 0xf;
18179                          unsigned rm = instr & 0xf;
18180                          ImmediateShiftOperand
18181                              shift_operand((instr >> 4) & 0x3,
18182                                            ((instr >> 6) & 0x3) |
18183                                                ((instr >> 10) & 0x1c));
18184                          if (InITBlock() &&
18185                              (instr & 0x00100000) == 0x00000000 &&
18186                              shift_operand.GetShift().IsLSL() &&
18187                              (shift_operand.GetAmount() == 0) &&
18188                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18189                               (rm < kNumberOfT32LowRegisters))) {
18190                            // AND<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18191                            and_(CurrentCond(),
18192                                 Wide,
18193                                 Register(rd),
18194                                 Register(rn),
18195                                 Register(rm));
18196                            if (((instr & 0xfff08000) != 0xea000000)) {
18197                              UnpredictableT32(instr);
18198                            }
18199                          } else if ((instr & 0x00100000) == 0x00000000) {
18200                            // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18201                            and_(CurrentCond(),
18202                                 Best,
18203                                 Register(rd),
18204                                 Register(rn),
18205                                 Operand(Register(rm),
18206                                         shift_operand.GetType(),
18207                                         shift_operand.GetAmount()));
18208                            if (((instr & 0xfff08000) != 0xea000000)) {
18209                              UnpredictableT32(instr);
18210                            }
18211                          } else {
18212                            UnallocatedT32(instr);
18213                          }
18214                          break;
18215                        }
18216                      }
18217                      break;
18218                    }
18219                    case 0x00200000: {
18220                      // 0xea200000
18221                      switch (instr & 0x000070f0) {
18222                        case 0x00000030: {
18223                          // 0xea200030
18224                          unsigned rd = (instr >> 8) & 0xf;
18225                          unsigned rn = (instr >> 16) & 0xf;
18226                          unsigned rm = instr & 0xf;
18227                          // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18228                          bic(CurrentCond(),
18229                              Best,
18230                              Register(rd),
18231                              Register(rn),
18232                              Operand(Register(rm), RRX));
18233                          if (((instr & 0xfff0f0f0) != 0xea200030)) {
18234                            UnpredictableT32(instr);
18235                          }
18236                          break;
18237                        }
18238                        default: {
18239                          if (((instr & 0x70f0) == 0x30)) {
18240                            UnallocatedT32(instr);
18241                            return;
18242                          }
18243                          unsigned rd = (instr >> 8) & 0xf;
18244                          unsigned rn = (instr >> 16) & 0xf;
18245                          unsigned rm = instr & 0xf;
18246                          ImmediateShiftOperand
18247                              shift_operand((instr >> 4) & 0x3,
18248                                            ((instr >> 6) & 0x3) |
18249                                                ((instr >> 10) & 0x1c));
18250                          if (InITBlock() &&
18251                              (instr & 0x00100000) == 0x00000000 &&
18252                              shift_operand.GetShift().IsLSL() &&
18253                              (shift_operand.GetAmount() == 0) &&
18254                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18255                               (rm < kNumberOfT32LowRegisters))) {
18256                            // BIC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18257                            bic(CurrentCond(),
18258                                Wide,
18259                                Register(rd),
18260                                Register(rn),
18261                                Register(rm));
18262                            if (((instr & 0xfff08000) != 0xea200000)) {
18263                              UnpredictableT32(instr);
18264                            }
18265                          } else if ((instr & 0x00100000) == 0x00000000) {
18266                            // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18267                            bic(CurrentCond(),
18268                                Best,
18269                                Register(rd),
18270                                Register(rn),
18271                                Operand(Register(rm),
18272                                        shift_operand.GetType(),
18273                                        shift_operand.GetAmount()));
18274                            if (((instr & 0xfff08000) != 0xea200000)) {
18275                              UnpredictableT32(instr);
18276                            }
18277                          } else {
18278                            UnallocatedT32(instr);
18279                          }
18280                          break;
18281                        }
18282                      }
18283                      break;
18284                    }
18285                    case 0x00400000: {
18286                      // 0xea400000
18287                      switch (instr & 0x000f0000) {
18288                        case 0x000f0000: {
18289                          // 0xea4f0000
18290                          switch (instr & 0x000070f0) {
18291                            case 0x00000030: {
18292                              // 0xea4f0030
18293                              unsigned rd = (instr >> 8) & 0xf;
18294                              unsigned rm = instr & 0xf;
18295                              // RRX{<c>}{<q>} {<Rd>}, <Rm> ; T3
18296                              rrx(CurrentCond(), Register(rd), Register(rm));
18297                              if (((instr & 0xfffff0f0) != 0xea4f0030)) {
18298                                UnpredictableT32(instr);
18299                              }
18300                              break;
18301                            }
18302                            default: {
18303                              if (((instr & 0x70f0) == 0x30)) {
18304                                UnallocatedT32(instr);
18305                                return;
18306                              }
18307                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18308                                   Uint32(0x2))) {
18309                                unsigned rd = (instr >> 8) & 0xf;
18310                                unsigned rm = instr & 0xf;
18311                                uint32_t amount = ((instr >> 6) & 0x3) |
18312                                                  ((instr >> 10) & 0x1c);
18313                                if (amount == 0) amount = 32;
18314                                if (InITBlock() &&
18315                                    ((rd < kNumberOfT32LowRegisters) &&
18316                                     (rm < kNumberOfT32LowRegisters) &&
18317                                     ((amount >= 1) && (amount <= 32)))) {
18318                                  // ASR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18319                                  asr(CurrentCond(),
18320                                      Wide,
18321                                      Register(rd),
18322                                      Register(rm),
18323                                      amount);
18324                                  if (((instr & 0xffff8030) != 0xea4f0020)) {
18325                                    UnpredictableT32(instr);
18326                                  }
18327                                } else {
18328                                  // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18329                                  asr(CurrentCond(),
18330                                      Best,
18331                                      Register(rd),
18332                                      Register(rm),
18333                                      amount);
18334                                  if (((instr & 0xffff8030) != 0xea4f0020)) {
18335                                    UnpredictableT32(instr);
18336                                  }
18337                                }
18338                                return;
18339                              }
18340                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18341                                   Uint32(0x0)) &&
18342                                  ((instr & 0x000070c0) != 0x00000000)) {
18343                                unsigned rd = (instr >> 8) & 0xf;
18344                                unsigned rm = instr & 0xf;
18345                                uint32_t amount = ((instr >> 6) & 0x3) |
18346                                                  ((instr >> 10) & 0x1c);
18347                                if (InITBlock() &&
18348                                    ((rd < kNumberOfT32LowRegisters) &&
18349                                     (rm < kNumberOfT32LowRegisters) &&
18350                                     ((amount >= 1) && (amount <= 31)))) {
18351                                  // LSL<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18352                                  lsl(CurrentCond(),
18353                                      Wide,
18354                                      Register(rd),
18355                                      Register(rm),
18356                                      amount);
18357                                  if (((instr & 0xffff8030) != 0xea4f0000)) {
18358                                    UnpredictableT32(instr);
18359                                  }
18360                                } else {
18361                                  // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18362                                  lsl(CurrentCond(),
18363                                      Best,
18364                                      Register(rd),
18365                                      Register(rm),
18366                                      amount);
18367                                  if (((instr & 0xffff8030) != 0xea4f0000)) {
18368                                    UnpredictableT32(instr);
18369                                  }
18370                                }
18371                                return;
18372                              }
18373                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18374                                   Uint32(0x1))) {
18375                                unsigned rd = (instr >> 8) & 0xf;
18376                                unsigned rm = instr & 0xf;
18377                                uint32_t amount = ((instr >> 6) & 0x3) |
18378                                                  ((instr >> 10) & 0x1c);
18379                                if (amount == 0) amount = 32;
18380                                if (InITBlock() &&
18381                                    ((rd < kNumberOfT32LowRegisters) &&
18382                                     (rm < kNumberOfT32LowRegisters) &&
18383                                     ((amount >= 1) && (amount <= 32)))) {
18384                                  // LSR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18385                                  lsr(CurrentCond(),
18386                                      Wide,
18387                                      Register(rd),
18388                                      Register(rm),
18389                                      amount);
18390                                  if (((instr & 0xffff8030) != 0xea4f0010)) {
18391                                    UnpredictableT32(instr);
18392                                  }
18393                                } else {
18394                                  // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18395                                  lsr(CurrentCond(),
18396                                      Best,
18397                                      Register(rd),
18398                                      Register(rm),
18399                                      amount);
18400                                  if (((instr & 0xffff8030) != 0xea4f0010)) {
18401                                    UnpredictableT32(instr);
18402                                  }
18403                                }
18404                                return;
18405                              }
18406                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18407                                   Uint32(0x3)) &&
18408                                  ((instr & 0x000070c0) != 0x00000000)) {
18409                                unsigned rd = (instr >> 8) & 0xf;
18410                                unsigned rm = instr & 0xf;
18411                                uint32_t amount = ((instr >> 6) & 0x3) |
18412                                                  ((instr >> 10) & 0x1c);
18413                                // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18414                                ror(CurrentCond(),
18415                                    Best,
18416                                    Register(rd),
18417                                    Register(rm),
18418                                    amount);
18419                                if (((instr & 0xffff8030) != 0xea4f0030)) {
18420                                  UnpredictableT32(instr);
18421                                }
18422                                return;
18423                              }
18424                              unsigned rd = (instr >> 8) & 0xf;
18425                              unsigned rm = instr & 0xf;
18426                              ImmediateShiftOperand
18427                                  shift_operand((instr >> 4) & 0x3,
18428                                                ((instr >> 6) & 0x3) |
18429                                                    ((instr >> 10) & 0x1c));
18430                              if ((instr & 0x00100000) == 0x00000000 &&
18431                                  (shift_operand.GetShift().IsLSL() &&
18432                                   (shift_operand.GetAmount() == 0))) {
18433                                // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18434                                mov(CurrentCond(),
18435                                    Wide,
18436                                    Register(rd),
18437                                    Operand(Register(rm),
18438                                            shift_operand.GetType(),
18439                                            shift_operand.GetAmount()));
18440                                if (((instr & 0xffff8000) != 0xea4f0000)) {
18441                                  UnpredictableT32(instr);
18442                                }
18443                              } else if (InITBlock() &&
18444                                         (instr & 0x00100000) == 0x00000000 &&
18445                                         ((rd < kNumberOfT32LowRegisters) &&
18446                                          (rm < kNumberOfT32LowRegisters))) {
18447                                // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18448                                mov(CurrentCond(),
18449                                    Wide,
18450                                    Register(rd),
18451                                    Operand(Register(rm),
18452                                            shift_operand.GetType(),
18453                                            shift_operand.GetAmount()));
18454                                if (((instr & 0xffff8000) != 0xea4f0000)) {
18455                                  UnpredictableT32(instr);
18456                                }
18457                              } else if ((instr & 0x00100000) == 0x00000000) {
18458                                // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18459                                mov(CurrentCond(),
18460                                    Best,
18461                                    Register(rd),
18462                                    Operand(Register(rm),
18463                                            shift_operand.GetType(),
18464                                            shift_operand.GetAmount()));
18465                                if (((instr & 0xffff8000) != 0xea4f0000)) {
18466                                  UnpredictableT32(instr);
18467                                }
18468                              } else {
18469                                UnallocatedT32(instr);
18470                              }
18471                              break;
18472                            }
18473                          }
18474                          break;
18475                        }
18476                        default: {
18477                          switch (instr & 0x000070f0) {
18478                            case 0x00000030: {
18479                              // 0xea400030
18480                              if (((instr & 0xf0000) == 0xf0000)) {
18481                                UnallocatedT32(instr);
18482                                return;
18483                              }
18484                              unsigned rd = (instr >> 8) & 0xf;
18485                              unsigned rn = (instr >> 16) & 0xf;
18486                              unsigned rm = instr & 0xf;
18487                              // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18488                              orr(CurrentCond(),
18489                                  Best,
18490                                  Register(rd),
18491                                  Register(rn),
18492                                  Operand(Register(rm), RRX));
18493                              if (((instr & 0xfff0f0f0) != 0xea400030)) {
18494                                UnpredictableT32(instr);
18495                              }
18496                              break;
18497                            }
18498                            default: {
18499                              if (((instr & 0xf0000) == 0xf0000) ||
18500                                  ((instr & 0x70f0) == 0x30)) {
18501                                UnallocatedT32(instr);
18502                                return;
18503                              }
18504                              unsigned rd = (instr >> 8) & 0xf;
18505                              unsigned rn = (instr >> 16) & 0xf;
18506                              unsigned rm = instr & 0xf;
18507                              ImmediateShiftOperand
18508                                  shift_operand((instr >> 4) & 0x3,
18509                                                ((instr >> 6) & 0x3) |
18510                                                    ((instr >> 10) & 0x1c));
18511                              if (InITBlock() &&
18512                                  (instr & 0x00100000) == 0x00000000 &&
18513                                  shift_operand.GetShift().IsLSL() &&
18514                                  (shift_operand.GetAmount() == 0) &&
18515                                  ((rd == rn) &&
18516                                   (rd < kNumberOfT32LowRegisters) &&
18517                                   (rm < kNumberOfT32LowRegisters))) {
18518                                // ORR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18519                                orr(CurrentCond(),
18520                                    Wide,
18521                                    Register(rd),
18522                                    Register(rn),
18523                                    Register(rm));
18524                                if (((instr & 0xfff08000) != 0xea400000)) {
18525                                  UnpredictableT32(instr);
18526                                }
18527                              } else if ((instr & 0x00100000) == 0x00000000) {
18528                                // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18529                                orr(CurrentCond(),
18530                                    Best,
18531                                    Register(rd),
18532                                    Register(rn),
18533                                    Operand(Register(rm),
18534                                            shift_operand.GetType(),
18535                                            shift_operand.GetAmount()));
18536                                if (((instr & 0xfff08000) != 0xea400000)) {
18537                                  UnpredictableT32(instr);
18538                                }
18539                              } else {
18540                                UnallocatedT32(instr);
18541                              }
18542                              break;
18543                            }
18544                          }
18545                          break;
18546                        }
18547                      }
18548                      break;
18549                    }
18550                    case 0x00600000: {
18551                      // 0xea600000
18552                      switch (instr & 0x000f0000) {
18553                        case 0x000f0000: {
18554                          // 0xea6f0000
18555                          switch (instr & 0x000070f0) {
18556                            case 0x00000030: {
18557                              // 0xea6f0030
18558                              unsigned rd = (instr >> 8) & 0xf;
18559                              unsigned rm = instr & 0xf;
18560                              // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
18561                              mvn(CurrentCond(),
18562                                  Best,
18563                                  Register(rd),
18564                                  Operand(Register(rm), RRX));
18565                              if (((instr & 0xfffff0f0) != 0xea6f0030)) {
18566                                UnpredictableT32(instr);
18567                              }
18568                              break;
18569                            }
18570                            default: {
18571                              if (((instr & 0x70f0) == 0x30)) {
18572                                UnallocatedT32(instr);
18573                                return;
18574                              }
18575                              unsigned rd = (instr >> 8) & 0xf;
18576                              unsigned rm = instr & 0xf;
18577                              ImmediateShiftOperand
18578                                  shift_operand((instr >> 4) & 0x3,
18579                                                ((instr >> 6) & 0x3) |
18580                                                    ((instr >> 10) & 0x1c));
18581                              if (InITBlock() &&
18582                                  (instr & 0x00100000) == 0x00000000 &&
18583                                  shift_operand.GetShift().IsLSL() &&
18584                                  (shift_operand.GetAmount() == 0) &&
18585                                  ((rd < kNumberOfT32LowRegisters) &&
18586                                   (rm < kNumberOfT32LowRegisters))) {
18587                                // MVN<c>.W <Rd>, <Rm> ; T2
18588                                mvn(CurrentCond(),
18589                                    Wide,
18590                                    Register(rd),
18591                                    Register(rm));
18592                                if (((instr & 0xffff8000) != 0xea6f0000)) {
18593                                  UnpredictableT32(instr);
18594                                }
18595                              } else if ((instr & 0x00100000) == 0x00000000) {
18596                                // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18597                                mvn(CurrentCond(),
18598                                    Best,
18599                                    Register(rd),
18600                                    Operand(Register(rm),
18601                                            shift_operand.GetType(),
18602                                            shift_operand.GetAmount()));
18603                                if (((instr & 0xffff8000) != 0xea6f0000)) {
18604                                  UnpredictableT32(instr);
18605                                }
18606                              } else {
18607                                UnallocatedT32(instr);
18608                              }
18609                              break;
18610                            }
18611                          }
18612                          break;
18613                        }
18614                        default: {
18615                          switch (instr & 0x000070f0) {
18616                            case 0x00000030: {
18617                              // 0xea600030
18618                              if (((instr & 0xf0000) == 0xf0000)) {
18619                                UnallocatedT32(instr);
18620                                return;
18621                              }
18622                              unsigned rd = (instr >> 8) & 0xf;
18623                              unsigned rn = (instr >> 16) & 0xf;
18624                              unsigned rm = instr & 0xf;
18625                              // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
18626                              orn(CurrentCond(),
18627                                  Register(rd),
18628                                  Register(rn),
18629                                  Operand(Register(rm), RRX));
18630                              if (((instr & 0xfff0f0f0) != 0xea600030)) {
18631                                UnpredictableT32(instr);
18632                              }
18633                              break;
18634                            }
18635                            default: {
18636                              if (((instr & 0xf0000) == 0xf0000) ||
18637                                  ((instr & 0x70f0) == 0x30)) {
18638                                UnallocatedT32(instr);
18639                                return;
18640                              }
18641                              unsigned rd = (instr >> 8) & 0xf;
18642                              unsigned rn = (instr >> 16) & 0xf;
18643                              unsigned rm = instr & 0xf;
18644                              ImmediateShiftOperand
18645                                  shift_operand((instr >> 4) & 0x3,
18646                                                ((instr >> 6) & 0x3) |
18647                                                    ((instr >> 10) & 0x1c));
18648                              // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
18649                              orn(CurrentCond(),
18650                                  Register(rd),
18651                                  Register(rn),
18652                                  Operand(Register(rm),
18653                                          shift_operand.GetType(),
18654                                          shift_operand.GetAmount()));
18655                              if (((instr & 0xfff08000) != 0xea600000)) {
18656                                UnpredictableT32(instr);
18657                              }
18658                              break;
18659                            }
18660                          }
18661                          break;
18662                        }
18663                      }
18664                      break;
18665                    }
18666                  }
18667                  break;
18668                }
18669                case 0x00100000: {
18670                  // 0xea100000
18671                  switch (instr & 0x00600000) {
18672                    case 0x00000000: {
18673                      // 0xea100000
18674                      switch (instr & 0x00000f00) {
18675                        case 0x00000f00: {
18676                          // 0xea100f00
18677                          switch (instr & 0x000070f0) {
18678                            case 0x00000030: {
18679                              // 0xea100f30
18680                              unsigned rn = (instr >> 16) & 0xf;
18681                              unsigned rm = instr & 0xf;
18682                              // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
18683                              tst(CurrentCond(),
18684                                  Best,
18685                                  Register(rn),
18686                                  Operand(Register(rm), RRX));
18687                              if (((instr & 0xfff0fff0) != 0xea100f30)) {
18688                                UnpredictableT32(instr);
18689                              }
18690                              break;
18691                            }
18692                            default: {
18693                              if (((instr & 0x70f0) == 0x30)) {
18694                                UnallocatedT32(instr);
18695                                return;
18696                              }
18697                              unsigned rn = (instr >> 16) & 0xf;
18698                              unsigned rm = instr & 0xf;
18699                              ImmediateShiftOperand
18700                                  shift_operand((instr >> 4) & 0x3,
18701                                                ((instr >> 6) & 0x3) |
18702                                                    ((instr >> 10) & 0x1c));
18703                              if (shift_operand.GetShift().IsLSL() &&
18704                                  (shift_operand.GetAmount() == 0) &&
18705                                  ((rn < kNumberOfT32LowRegisters) &&
18706                                   (rm < kNumberOfT32LowRegisters))) {
18707                                // TST{<c>}.W <Rn>, <Rm> ; T2
18708                                tst(CurrentCond(),
18709                                    Wide,
18710                                    Register(rn),
18711                                    Register(rm));
18712                                if (((instr & 0xfff08f00) != 0xea100f00)) {
18713                                  UnpredictableT32(instr);
18714                                }
18715                              } else {
18716                                // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18717                                tst(CurrentCond(),
18718                                    Best,
18719                                    Register(rn),
18720                                    Operand(Register(rm),
18721                                            shift_operand.GetType(),
18722                                            shift_operand.GetAmount()));
18723                                if (((instr & 0xfff08f00) != 0xea100f00)) {
18724                                  UnpredictableT32(instr);
18725                                }
18726                              }
18727                              break;
18728                            }
18729                          }
18730                          break;
18731                        }
18732                        default: {
18733                          switch (instr & 0x000070f0) {
18734                            case 0x00000030: {
18735                              // 0xea100030
18736                              if (((instr & 0xf00) == 0xf00)) {
18737                                UnallocatedT32(instr);
18738                                return;
18739                              }
18740                              unsigned rd = (instr >> 8) & 0xf;
18741                              unsigned rn = (instr >> 16) & 0xf;
18742                              unsigned rm = instr & 0xf;
18743                              // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18744                              ands(CurrentCond(),
18745                                   Best,
18746                                   Register(rd),
18747                                   Register(rn),
18748                                   Operand(Register(rm), RRX));
18749                              if (((instr & 0xfff0f0f0) != 0xea100030)) {
18750                                UnpredictableT32(instr);
18751                              }
18752                              break;
18753                            }
18754                            default: {
18755                              if (((instr & 0x70f0) == 0x30) ||
18756                                  ((instr & 0xf00) == 0xf00)) {
18757                                UnallocatedT32(instr);
18758                                return;
18759                              }
18760                              unsigned rd = (instr >> 8) & 0xf;
18761                              unsigned rn = (instr >> 16) & 0xf;
18762                              unsigned rm = instr & 0xf;
18763                              ImmediateShiftOperand
18764                                  shift_operand((instr >> 4) & 0x3,
18765                                                ((instr >> 6) & 0x3) |
18766                                                    ((instr >> 10) & 0x1c));
18767                              if (OutsideITBlock() &&
18768                                  (instr & 0x00100000) == 0x00100000 &&
18769                                  shift_operand.GetShift().IsLSL() &&
18770                                  (shift_operand.GetAmount() == 0) &&
18771                                  ((rd == rn) &&
18772                                   (rd < kNumberOfT32LowRegisters) &&
18773                                   (rm < kNumberOfT32LowRegisters))) {
18774                                // ANDS.W {<Rd>}, <Rn>, <Rm> ; T2
18775                                ands(Condition::None(),
18776                                     Wide,
18777                                     Register(rd),
18778                                     Register(rn),
18779                                     Register(rm));
18780                                if (((instr & 0xfff08000) != 0xea100000)) {
18781                                  UnpredictableT32(instr);
18782                                }
18783                              } else if ((instr & 0x00100000) == 0x00100000) {
18784                                // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18785                                ands(CurrentCond(),
18786                                     Best,
18787                                     Register(rd),
18788                                     Register(rn),
18789                                     Operand(Register(rm),
18790                                             shift_operand.GetType(),
18791                                             shift_operand.GetAmount()));
18792                                if (((instr & 0xfff08000) != 0xea100000)) {
18793                                  UnpredictableT32(instr);
18794                                }
18795                              } else {
18796                                UnallocatedT32(instr);
18797                              }
18798                              break;
18799                            }
18800                          }
18801                          break;
18802                        }
18803                      }
18804                      break;
18805                    }
18806                    case 0x00200000: {
18807                      // 0xea300000
18808                      switch (instr & 0x000070f0) {
18809                        case 0x00000030: {
18810                          // 0xea300030
18811                          unsigned rd = (instr >> 8) & 0xf;
18812                          unsigned rn = (instr >> 16) & 0xf;
18813                          unsigned rm = instr & 0xf;
18814                          // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18815                          bics(CurrentCond(),
18816                               Best,
18817                               Register(rd),
18818                               Register(rn),
18819                               Operand(Register(rm), RRX));
18820                          if (((instr & 0xfff0f0f0) != 0xea300030)) {
18821                            UnpredictableT32(instr);
18822                          }
18823                          break;
18824                        }
18825                        default: {
18826                          if (((instr & 0x70f0) == 0x30)) {
18827                            UnallocatedT32(instr);
18828                            return;
18829                          }
18830                          unsigned rd = (instr >> 8) & 0xf;
18831                          unsigned rn = (instr >> 16) & 0xf;
18832                          unsigned rm = instr & 0xf;
18833                          ImmediateShiftOperand
18834                              shift_operand((instr >> 4) & 0x3,
18835                                            ((instr >> 6) & 0x3) |
18836                                                ((instr >> 10) & 0x1c));
18837                          if (OutsideITBlock() &&
18838                              (instr & 0x00100000) == 0x00100000 &&
18839                              shift_operand.GetShift().IsLSL() &&
18840                              (shift_operand.GetAmount() == 0) &&
18841                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18842                               (rm < kNumberOfT32LowRegisters))) {
18843                            // BICS.W {<Rd>}, <Rn>, <Rm> ; T2
18844                            bics(Condition::None(),
18845                                 Wide,
18846                                 Register(rd),
18847                                 Register(rn),
18848                                 Register(rm));
18849                            if (((instr & 0xfff08000) != 0xea300000)) {
18850                              UnpredictableT32(instr);
18851                            }
18852                          } else if ((instr & 0x00100000) == 0x00100000) {
18853                            // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18854                            bics(CurrentCond(),
18855                                 Best,
18856                                 Register(rd),
18857                                 Register(rn),
18858                                 Operand(Register(rm),
18859                                         shift_operand.GetType(),
18860                                         shift_operand.GetAmount()));
18861                            if (((instr & 0xfff08000) != 0xea300000)) {
18862                              UnpredictableT32(instr);
18863                            }
18864                          } else {
18865                            UnallocatedT32(instr);
18866                          }
18867                          break;
18868                        }
18869                      }
18870                      break;
18871                    }
18872                    case 0x00400000: {
18873                      // 0xea500000
18874                      switch (instr & 0x000f0000) {
18875                        case 0x000f0000: {
18876                          // 0xea5f0000
18877                          switch (instr & 0x000070f0) {
18878                            case 0x00000030: {
18879                              // 0xea5f0030
18880                              unsigned rd = (instr >> 8) & 0xf;
18881                              unsigned rm = instr & 0xf;
18882                              // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; T3
18883                              rrxs(CurrentCond(), Register(rd), Register(rm));
18884                              if (((instr & 0xfffff0f0) != 0xea5f0030)) {
18885                                UnpredictableT32(instr);
18886                              }
18887                              break;
18888                            }
18889                            default: {
18890                              if (((instr & 0x70f0) == 0x30)) {
18891                                UnallocatedT32(instr);
18892                                return;
18893                              }
18894                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18895                                   Uint32(0x2))) {
18896                                unsigned rd = (instr >> 8) & 0xf;
18897                                unsigned rm = instr & 0xf;
18898                                uint32_t amount = ((instr >> 6) & 0x3) |
18899                                                  ((instr >> 10) & 0x1c);
18900                                if (amount == 0) amount = 32;
18901                                if (OutsideITBlock() &&
18902                                    ((rd < kNumberOfT32LowRegisters) &&
18903                                     (rm < kNumberOfT32LowRegisters) &&
18904                                     ((amount >= 1) && (amount <= 32)))) {
18905                                  // ASRS.W {<Rd>}, <Rm>, #<imm> ; T3
18906                                  asrs(Condition::None(),
18907                                       Wide,
18908                                       Register(rd),
18909                                       Register(rm),
18910                                       amount);
18911                                  if (((instr & 0xffff8030) != 0xea5f0020)) {
18912                                    UnpredictableT32(instr);
18913                                  }
18914                                } else {
18915                                  // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18916                                  asrs(CurrentCond(),
18917                                       Best,
18918                                       Register(rd),
18919                                       Register(rm),
18920                                       amount);
18921                                  if (((instr & 0xffff8030) != 0xea5f0020)) {
18922                                    UnpredictableT32(instr);
18923                                  }
18924                                }
18925                                return;
18926                              }
18927                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18928                                   Uint32(0x0)) &&
18929                                  ((instr & 0x000070c0) != 0x00000000)) {
18930                                unsigned rd = (instr >> 8) & 0xf;
18931                                unsigned rm = instr & 0xf;
18932                                uint32_t amount = ((instr >> 6) & 0x3) |
18933                                                  ((instr >> 10) & 0x1c);
18934                                if (OutsideITBlock() &&
18935                                    ((rd < kNumberOfT32LowRegisters) &&
18936                                     (rm < kNumberOfT32LowRegisters) &&
18937                                     ((amount >= 1) && (amount <= 31)))) {
18938                                  // LSLS.W {<Rd>}, <Rm>, #<imm> ; T3
18939                                  lsls(Condition::None(),
18940                                       Wide,
18941                                       Register(rd),
18942                                       Register(rm),
18943                                       amount);
18944                                  if (((instr & 0xffff8030) != 0xea5f0000)) {
18945                                    UnpredictableT32(instr);
18946                                  }
18947                                } else {
18948                                  // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18949                                  lsls(CurrentCond(),
18950                                       Best,
18951                                       Register(rd),
18952                                       Register(rm),
18953                                       amount);
18954                                  if (((instr & 0xffff8030) != 0xea5f0000)) {
18955                                    UnpredictableT32(instr);
18956                                  }
18957                                }
18958                                return;
18959                              }
18960                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18961                                   Uint32(0x1))) {
18962                                unsigned rd = (instr >> 8) & 0xf;
18963                                unsigned rm = instr & 0xf;
18964                                uint32_t amount = ((instr >> 6) & 0x3) |
18965                                                  ((instr >> 10) & 0x1c);
18966                                if (amount == 0) amount = 32;
18967                                if (OutsideITBlock() &&
18968                                    ((rd < kNumberOfT32LowRegisters) &&
18969                                     (rm < kNumberOfT32LowRegisters) &&
18970                                     ((amount >= 1) && (amount <= 32)))) {
18971                                  // LSRS.W {<Rd>}, <Rm>, #<imm> ; T3
18972                                  lsrs(Condition::None(),
18973                                       Wide,
18974                                       Register(rd),
18975                                       Register(rm),
18976                                       amount);
18977                                  if (((instr & 0xffff8030) != 0xea5f0010)) {
18978                                    UnpredictableT32(instr);
18979                                  }
18980                                } else {
18981                                  // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18982                                  lsrs(CurrentCond(),
18983                                       Best,
18984                                       Register(rd),
18985                                       Register(rm),
18986                                       amount);
18987                                  if (((instr & 0xffff8030) != 0xea5f0010)) {
18988                                    UnpredictableT32(instr);
18989                                  }
18990                                }
18991                                return;
18992                              }
18993                              if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18994                                   Uint32(0x3)) &&
18995                                  ((instr & 0x000070c0) != 0x00000000)) {
18996                                unsigned rd = (instr >> 8) & 0xf;
18997                                unsigned rm = instr & 0xf;
18998                                uint32_t amount = ((instr >> 6) & 0x3) |
18999                                                  ((instr >> 10) & 0x1c);
19000                                // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
19001                                rors(CurrentCond(),
19002                                     Best,
19003                                     Register(rd),
19004                                     Register(rm),
19005                                     amount);
19006                                if (((instr & 0xffff8030) != 0xea5f0030)) {
19007                                  UnpredictableT32(instr);
19008                                }
19009                                return;
19010                              }
19011                              unsigned rd = (instr >> 8) & 0xf;
19012                              unsigned rm = instr & 0xf;
19013                              ImmediateShiftOperand
19014                                  shift_operand((instr >> 4) & 0x3,
19015                                                ((instr >> 6) & 0x3) |
19016                                                    ((instr >> 10) & 0x1c));
19017                              if (OutsideITBlock() &&
19018                                  (instr & 0x00100000) == 0x00100000 &&
19019                                  ((rd < kNumberOfT32LowRegisters) &&
19020                                   (rm < kNumberOfT32LowRegisters))) {
19021                                // MOVS.W <Rd>, <Rm> {, <shift> #<amount> } ; T3
19022                                movs(Condition::None(),
19023                                     Wide,
19024                                     Register(rd),
19025                                     Operand(Register(rm),
19026                                             shift_operand.GetType(),
19027                                             shift_operand.GetAmount()));
19028                                if (((instr & 0xffff8000) != 0xea5f0000)) {
19029                                  UnpredictableT32(instr);
19030                                }
19031                              } else if ((instr & 0x00100000) == 0x00100000) {
19032                                // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19033                                movs(CurrentCond(),
19034                                     Best,
19035                                     Register(rd),
19036                                     Operand(Register(rm),
19037                                             shift_operand.GetType(),
19038                                             shift_operand.GetAmount()));
19039                                if (((instr & 0xffff8000) != 0xea5f0000)) {
19040                                  UnpredictableT32(instr);
19041                                }
19042                              } else {
19043                                UnallocatedT32(instr);
19044                              }
19045                              break;
19046                            }
19047                          }
19048                          break;
19049                        }
19050                        default: {
19051                          switch (instr & 0x000070f0) {
19052                            case 0x00000030: {
19053                              // 0xea500030
19054                              if (((instr & 0xf0000) == 0xf0000)) {
19055                                UnallocatedT32(instr);
19056                                return;
19057                              }
19058                              unsigned rd = (instr >> 8) & 0xf;
19059                              unsigned rn = (instr >> 16) & 0xf;
19060                              unsigned rm = instr & 0xf;
19061                              // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19062                              orrs(CurrentCond(),
19063                                   Best,
19064                                   Register(rd),
19065                                   Register(rn),
19066                                   Operand(Register(rm), RRX));
19067                              if (((instr & 0xfff0f0f0) != 0xea500030)) {
19068                                UnpredictableT32(instr);
19069                              }
19070                              break;
19071                            }
19072                            default: {
19073                              if (((instr & 0xf0000) == 0xf0000) ||
19074                                  ((instr & 0x70f0) == 0x30)) {
19075                                UnallocatedT32(instr);
19076                                return;
19077                              }
19078                              unsigned rd = (instr >> 8) & 0xf;
19079                              unsigned rn = (instr >> 16) & 0xf;
19080                              unsigned rm = instr & 0xf;
19081                              ImmediateShiftOperand
19082                                  shift_operand((instr >> 4) & 0x3,
19083                                                ((instr >> 6) & 0x3) |
19084                                                    ((instr >> 10) & 0x1c));
19085                              if (OutsideITBlock() &&
19086                                  (instr & 0x00100000) == 0x00100000 &&
19087                                  shift_operand.GetShift().IsLSL() &&
19088                                  (shift_operand.GetAmount() == 0) &&
19089                                  ((rd == rn) &&
19090                                   (rd < kNumberOfT32LowRegisters) &&
19091                                   (rm < kNumberOfT32LowRegisters))) {
19092                                // ORRS.W {<Rd>}, <Rn>, <Rm> ; T2
19093                                orrs(Condition::None(),
19094                                     Wide,
19095                                     Register(rd),
19096                                     Register(rn),
19097                                     Register(rm));
19098                                if (((instr & 0xfff08000) != 0xea500000)) {
19099                                  UnpredictableT32(instr);
19100                                }
19101                              } else if ((instr & 0x00100000) == 0x00100000) {
19102                                // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19103                                orrs(CurrentCond(),
19104                                     Best,
19105                                     Register(rd),
19106                                     Register(rn),
19107                                     Operand(Register(rm),
19108                                             shift_operand.GetType(),
19109                                             shift_operand.GetAmount()));
19110                                if (((instr & 0xfff08000) != 0xea500000)) {
19111                                  UnpredictableT32(instr);
19112                                }
19113                              } else {
19114                                UnallocatedT32(instr);
19115                              }
19116                              break;
19117                            }
19118                          }
19119                          break;
19120                        }
19121                      }
19122                      break;
19123                    }
19124                    case 0x00600000: {
19125                      // 0xea700000
19126                      switch (instr & 0x000f0000) {
19127                        case 0x000f0000: {
19128                          // 0xea7f0000
19129                          switch (instr & 0x000070f0) {
19130                            case 0x00000030: {
19131                              // 0xea7f0030
19132                              unsigned rd = (instr >> 8) & 0xf;
19133                              unsigned rm = instr & 0xf;
19134                              // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
19135                              mvns(CurrentCond(),
19136                                   Best,
19137                                   Register(rd),
19138                                   Operand(Register(rm), RRX));
19139                              if (((instr & 0xfffff0f0) != 0xea7f0030)) {
19140                                UnpredictableT32(instr);
19141                              }
19142                              break;
19143                            }
19144                            default: {
19145                              if (((instr & 0x70f0) == 0x30)) {
19146                                UnallocatedT32(instr);
19147                                return;
19148                              }
19149                              unsigned rd = (instr >> 8) & 0xf;
19150                              unsigned rm = instr & 0xf;
19151                              ImmediateShiftOperand
19152                                  shift_operand((instr >> 4) & 0x3,
19153                                                ((instr >> 6) & 0x3) |
19154                                                    ((instr >> 10) & 0x1c));
19155                              if (OutsideITBlock() &&
19156                                  (instr & 0x00100000) == 0x00100000 &&
19157                                  shift_operand.GetShift().IsLSL() &&
19158                                  (shift_operand.GetAmount() == 0) &&
19159                                  ((rd < kNumberOfT32LowRegisters) &&
19160                                   (rm < kNumberOfT32LowRegisters))) {
19161                                // MVNS.W <Rd>, <Rm> ; T2
19162                                mvns(Condition::None(),
19163                                     Wide,
19164                                     Register(rd),
19165                                     Register(rm));
19166                                if (((instr & 0xffff8000) != 0xea7f0000)) {
19167                                  UnpredictableT32(instr);
19168                                }
19169                              } else if ((instr & 0x00100000) == 0x00100000) {
19170                                // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19171                                mvns(CurrentCond(),
19172                                     Best,
19173                                     Register(rd),
19174                                     Operand(Register(rm),
19175                                             shift_operand.GetType(),
19176                                             shift_operand.GetAmount()));
19177                                if (((instr & 0xffff8000) != 0xea7f0000)) {
19178                                  UnpredictableT32(instr);
19179                                }
19180                              } else {
19181                                UnallocatedT32(instr);
19182                              }
19183                              break;
19184                            }
19185                          }
19186                          break;
19187                        }
19188                        default: {
19189                          switch (instr & 0x000070f0) {
19190                            case 0x00000030: {
19191                              // 0xea700030
19192                              if (((instr & 0xf0000) == 0xf0000)) {
19193                                UnallocatedT32(instr);
19194                                return;
19195                              }
19196                              unsigned rd = (instr >> 8) & 0xf;
19197                              unsigned rn = (instr >> 16) & 0xf;
19198                              unsigned rm = instr & 0xf;
19199                              // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
19200                              orns(CurrentCond(),
19201                                   Register(rd),
19202                                   Register(rn),
19203                                   Operand(Register(rm), RRX));
19204                              if (((instr & 0xfff0f0f0) != 0xea700030)) {
19205                                UnpredictableT32(instr);
19206                              }
19207                              break;
19208                            }
19209                            default: {
19210                              if (((instr & 0xf0000) == 0xf0000) ||
19211                                  ((instr & 0x70f0) == 0x30)) {
19212                                UnallocatedT32(instr);
19213                                return;
19214                              }
19215                              unsigned rd = (instr >> 8) & 0xf;
19216                              unsigned rn = (instr >> 16) & 0xf;
19217                              unsigned rm = instr & 0xf;
19218                              ImmediateShiftOperand
19219                                  shift_operand((instr >> 4) & 0x3,
19220                                                ((instr >> 6) & 0x3) |
19221                                                    ((instr >> 10) & 0x1c));
19222                              // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
19223                              orns(CurrentCond(),
19224                                   Register(rd),
19225                                   Register(rn),
19226                                   Operand(Register(rm),
19227                                           shift_operand.GetType(),
19228                                           shift_operand.GetAmount()));
19229                              if (((instr & 0xfff08000) != 0xea700000)) {
19230                                UnpredictableT32(instr);
19231                              }
19232                              break;
19233                            }
19234                          }
19235                          break;
19236                        }
19237                      }
19238                      break;
19239                    }
19240                  }
19241                  break;
19242                }
19243                case 0x00800000: {
19244                  // 0xea800000
19245                  switch (instr & 0x00600000) {
19246                    case 0x00000000: {
19247                      // 0xea800000
19248                      switch (instr & 0x000070f0) {
19249                        case 0x00000030: {
19250                          // 0xea800030
19251                          unsigned rd = (instr >> 8) & 0xf;
19252                          unsigned rn = (instr >> 16) & 0xf;
19253                          unsigned rm = instr & 0xf;
19254                          // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19255                          eor(CurrentCond(),
19256                              Best,
19257                              Register(rd),
19258                              Register(rn),
19259                              Operand(Register(rm), RRX));
19260                          if (((instr & 0xfff0f0f0) != 0xea800030)) {
19261                            UnpredictableT32(instr);
19262                          }
19263                          break;
19264                        }
19265                        default: {
19266                          if (((instr & 0x70f0) == 0x30)) {
19267                            UnallocatedT32(instr);
19268                            return;
19269                          }
19270                          unsigned rd = (instr >> 8) & 0xf;
19271                          unsigned rn = (instr >> 16) & 0xf;
19272                          unsigned rm = instr & 0xf;
19273                          ImmediateShiftOperand
19274                              shift_operand((instr >> 4) & 0x3,
19275                                            ((instr >> 6) & 0x3) |
19276                                                ((instr >> 10) & 0x1c));
19277                          if (InITBlock() &&
19278                              (instr & 0x00100000) == 0x00000000 &&
19279                              shift_operand.GetShift().IsLSL() &&
19280                              (shift_operand.GetAmount() == 0) &&
19281                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19282                               (rm < kNumberOfT32LowRegisters))) {
19283                            // EOR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19284                            eor(CurrentCond(),
19285                                Wide,
19286                                Register(rd),
19287                                Register(rn),
19288                                Register(rm));
19289                            if (((instr & 0xfff08000) != 0xea800000)) {
19290                              UnpredictableT32(instr);
19291                            }
19292                          } else if ((instr & 0x00100000) == 0x00000000) {
19293                            // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19294                            eor(CurrentCond(),
19295                                Best,
19296                                Register(rd),
19297                                Register(rn),
19298                                Operand(Register(rm),
19299                                        shift_operand.GetType(),
19300                                        shift_operand.GetAmount()));
19301                            if (((instr & 0xfff08000) != 0xea800000)) {
19302                              UnpredictableT32(instr);
19303                            }
19304                          } else {
19305                            UnallocatedT32(instr);
19306                          }
19307                          break;
19308                        }
19309                      }
19310                      break;
19311                    }
19312                    case 0x00400000: {
19313                      // 0xeac00000
19314                      switch (instr & 0x00000030) {
19315                        case 0x00000000: {
19316                          // 0xeac00000
19317                          unsigned rd = (instr >> 8) & 0xf;
19318                          unsigned rn = (instr >> 16) & 0xf;
19319                          unsigned rm = instr & 0xf;
19320                          uint32_t amount =
19321                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
19322                          // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; T1 NOLINT(whitespace/line_length)
19323                          pkhbt(CurrentCond(),
19324                                Register(rd),
19325                                Register(rn),
19326                                Operand(Register(rm), LSL, amount));
19327                          if (((instr & 0xfff08030) != 0xeac00000)) {
19328                            UnpredictableT32(instr);
19329                          }
19330                          break;
19331                        }
19332                        case 0x00000020: {
19333                          // 0xeac00020
19334                          unsigned rd = (instr >> 8) & 0xf;
19335                          unsigned rn = (instr >> 16) & 0xf;
19336                          unsigned rm = instr & 0xf;
19337                          uint32_t amount =
19338                              ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
19339                          if (amount == 0) amount = 32;
19340                          // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; T1 NOLINT(whitespace/line_length)
19341                          pkhtb(CurrentCond(),
19342                                Register(rd),
19343                                Register(rn),
19344                                Operand(Register(rm), ASR, amount));
19345                          if (((instr & 0xfff08030) != 0xeac00020)) {
19346                            UnpredictableT32(instr);
19347                          }
19348                          break;
19349                        }
19350                        default:
19351                          UnallocatedT32(instr);
19352                          break;
19353                      }
19354                      break;
19355                    }
19356                    default:
19357                      UnallocatedT32(instr);
19358                      break;
19359                  }
19360                  break;
19361                }
19362                case 0x00900000: {
19363                  // 0xea900000
19364                  switch (instr & 0x00600000) {
19365                    case 0x00000000: {
19366                      // 0xea900000
19367                      switch (instr & 0x00000f00) {
19368                        case 0x00000f00: {
19369                          // 0xea900f00
19370                          switch (instr & 0x000070f0) {
19371                            case 0x00000030: {
19372                              // 0xea900f30
19373                              unsigned rn = (instr >> 16) & 0xf;
19374                              unsigned rm = instr & 0xf;
19375                              // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; T1
19376                              teq(CurrentCond(),
19377                                  Register(rn),
19378                                  Operand(Register(rm), RRX));
19379                              if (((instr & 0xfff0fff0) != 0xea900f30)) {
19380                                UnpredictableT32(instr);
19381                              }
19382                              break;
19383                            }
19384                            default: {
19385                              if (((instr & 0x70f0) == 0x30)) {
19386                                UnallocatedT32(instr);
19387                                return;
19388                              }
19389                              unsigned rn = (instr >> 16) & 0xf;
19390                              unsigned rm = instr & 0xf;
19391                              ImmediateShiftOperand
19392                                  shift_operand((instr >> 4) & 0x3,
19393                                                ((instr >> 6) & 0x3) |
19394                                                    ((instr >> 10) & 0x1c));
19395                              // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
19396                              teq(CurrentCond(),
19397                                  Register(rn),
19398                                  Operand(Register(rm),
19399                                          shift_operand.GetType(),
19400                                          shift_operand.GetAmount()));
19401                              if (((instr & 0xfff08f00) != 0xea900f00)) {
19402                                UnpredictableT32(instr);
19403                              }
19404                              break;
19405                            }
19406                          }
19407                          break;
19408                        }
19409                        default: {
19410                          switch (instr & 0x000070f0) {
19411                            case 0x00000030: {
19412                              // 0xea900030
19413                              if (((instr & 0xf00) == 0xf00)) {
19414                                UnallocatedT32(instr);
19415                                return;
19416                              }
19417                              unsigned rd = (instr >> 8) & 0xf;
19418                              unsigned rn = (instr >> 16) & 0xf;
19419                              unsigned rm = instr & 0xf;
19420                              // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19421                              eors(CurrentCond(),
19422                                   Best,
19423                                   Register(rd),
19424                                   Register(rn),
19425                                   Operand(Register(rm), RRX));
19426                              if (((instr & 0xfff0f0f0) != 0xea900030)) {
19427                                UnpredictableT32(instr);
19428                              }
19429                              break;
19430                            }
19431                            default: {
19432                              if (((instr & 0x70f0) == 0x30) ||
19433                                  ((instr & 0xf00) == 0xf00)) {
19434                                UnallocatedT32(instr);
19435                                return;
19436                              }
19437                              unsigned rd = (instr >> 8) & 0xf;
19438                              unsigned rn = (instr >> 16) & 0xf;
19439                              unsigned rm = instr & 0xf;
19440                              ImmediateShiftOperand
19441                                  shift_operand((instr >> 4) & 0x3,
19442                                                ((instr >> 6) & 0x3) |
19443                                                    ((instr >> 10) & 0x1c));
19444                              if (OutsideITBlock() &&
19445                                  (instr & 0x00100000) == 0x00100000 &&
19446                                  shift_operand.GetShift().IsLSL() &&
19447                                  (shift_operand.GetAmount() == 0) &&
19448                                  ((rd == rn) &&
19449                                   (rd < kNumberOfT32LowRegisters) &&
19450                                   (rm < kNumberOfT32LowRegisters))) {
19451                                // EORS.W {<Rd>}, <Rn>, <Rm> ; T2
19452                                eors(Condition::None(),
19453                                     Wide,
19454                                     Register(rd),
19455                                     Register(rn),
19456                                     Register(rm));
19457                                if (((instr & 0xfff08000) != 0xea900000)) {
19458                                  UnpredictableT32(instr);
19459                                }
19460                              } else if ((instr & 0x00100000) == 0x00100000) {
19461                                // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19462                                eors(CurrentCond(),
19463                                     Best,
19464                                     Register(rd),
19465                                     Register(rn),
19466                                     Operand(Register(rm),
19467                                             shift_operand.GetType(),
19468                                             shift_operand.GetAmount()));
19469                                if (((instr & 0xfff08000) != 0xea900000)) {
19470                                  UnpredictableT32(instr);
19471                                }
19472                              } else {
19473                                UnallocatedT32(instr);
19474                              }
19475                              break;
19476                            }
19477                          }
19478                          break;
19479                        }
19480                      }
19481                      break;
19482                    }
19483                    default:
19484                      UnallocatedT32(instr);
19485                      break;
19486                  }
19487                  break;
19488                }
19489                case 0x01000000: {
19490                  // 0xeb000000
19491                  switch (instr & 0x00600000) {
19492                    case 0x00000000: {
19493                      // 0xeb000000
19494                      switch (instr & 0x000f0000) {
19495                        case 0x000d0000: {
19496                          // 0xeb0d0000
19497                          switch (instr & 0x000070f0) {
19498                            case 0x00000030: {
19499                              // 0xeb0d0030
19500                              unsigned rd = (instr >> 8) & 0xf;
19501                              unsigned rm = instr & 0xf;
19502                              // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
19503                              add(CurrentCond(),
19504                                  Best,
19505                                  Register(rd),
19506                                  sp,
19507                                  Operand(Register(rm), RRX));
19508                              if (((instr & 0xfffff0f0) != 0xeb0d0030)) {
19509                                UnpredictableT32(instr);
19510                              }
19511                              break;
19512                            }
19513                            default: {
19514                              if (((instr & 0x70f0) == 0x30)) {
19515                                UnallocatedT32(instr);
19516                                return;
19517                              }
19518                              unsigned rd = (instr >> 8) & 0xf;
19519                              unsigned rm = instr & 0xf;
19520                              ImmediateShiftOperand
19521                                  shift_operand((instr >> 4) & 0x3,
19522                                                ((instr >> 6) & 0x3) |
19523                                                    ((instr >> 10) & 0x1c));
19524                              if ((instr & 0x00100000) == 0x00000000 &&
19525                                  shift_operand.GetShift().IsLSL() &&
19526                                  (shift_operand.GetAmount() == 0) &&
19527                                  (((rd == rm)) || ((rd == sp.GetCode())))) {
19528                                // ADD{<c>}.W {<Rd>}, SP, <Rm> ; T3
19529                                add(CurrentCond(),
19530                                    Wide,
19531                                    Register(rd),
19532                                    sp,
19533                                    Register(rm));
19534                                if (((instr & 0xffff8000) != 0xeb0d0000)) {
19535                                  UnpredictableT32(instr);
19536                                }
19537                              } else if ((instr & 0x00100000) == 0x00000000) {
19538                                // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19539                                add(CurrentCond(),
19540                                    Best,
19541                                    Register(rd),
19542                                    sp,
19543                                    Operand(Register(rm),
19544                                            shift_operand.GetType(),
19545                                            shift_operand.GetAmount()));
19546                                if (((instr & 0xffff8000) != 0xeb0d0000)) {
19547                                  UnpredictableT32(instr);
19548                                }
19549                              } else {
19550                                UnallocatedT32(instr);
19551                              }
19552                              break;
19553                            }
19554                          }
19555                          break;
19556                        }
19557                        default: {
19558                          switch (instr & 0x000070f0) {
19559                            case 0x00000030: {
19560                              // 0xeb000030
19561                              if (((instr & 0xf0000) == 0xd0000)) {
19562                                UnallocatedT32(instr);
19563                                return;
19564                              }
19565                              unsigned rd = (instr >> 8) & 0xf;
19566                              unsigned rn = (instr >> 16) & 0xf;
19567                              unsigned rm = instr & 0xf;
19568                              // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
19569                              add(CurrentCond(),
19570                                  Best,
19571                                  Register(rd),
19572                                  Register(rn),
19573                                  Operand(Register(rm), RRX));
19574                              if (((instr & 0xfff0f0f0) != 0xeb000030)) {
19575                                UnpredictableT32(instr);
19576                              }
19577                              break;
19578                            }
19579                            default: {
19580                              if (((instr & 0xf0000) == 0xd0000) ||
19581                                  ((instr & 0x70f0) == 0x30)) {
19582                                UnallocatedT32(instr);
19583                                return;
19584                              }
19585                              unsigned rd = (instr >> 8) & 0xf;
19586                              unsigned rn = (instr >> 16) & 0xf;
19587                              unsigned rm = instr & 0xf;
19588                              ImmediateShiftOperand
19589                                  shift_operand((instr >> 4) & 0x3,
19590                                                ((instr >> 6) & 0x3) |
19591                                                    ((instr >> 10) & 0x1c));
19592                              if (InITBlock() &&
19593                                  (instr & 0x00100000) == 0x00000000 &&
19594                                  shift_operand.GetShift().IsLSL() &&
19595                                  (shift_operand.GetAmount() == 0) &&
19596                                  ((rd < kNumberOfT32LowRegisters) &&
19597                                   (rn < kNumberOfT32LowRegisters) &&
19598                                   (rm < kNumberOfT32LowRegisters))) {
19599                                // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
19600                                add(CurrentCond(),
19601                                    Wide,
19602                                    Register(rd),
19603                                    Register(rn),
19604                                    Register(rm));
19605                                if (((instr & 0xfff08000) != 0xeb000000)) {
19606                                  UnpredictableT32(instr);
19607                                }
19608                              } else if ((instr & 0x00100000) == 0x00000000 &&
19609                                         shift_operand.GetShift().IsLSL() &&
19610                                         (shift_operand.GetAmount() == 0) &&
19611                                         ((rd == rn))) {
19612                                // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
19613                                add(CurrentCond(),
19614                                    Wide,
19615                                    Register(rd),
19616                                    Register(rn),
19617                                    Register(rm));
19618                                if (((instr & 0xfff08000) != 0xeb000000)) {
19619                                  UnpredictableT32(instr);
19620                                }
19621                              } else if ((instr & 0x00100000) == 0x00000000) {
19622                                // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19623                                add(CurrentCond(),
19624                                    Best,
19625                                    Register(rd),
19626                                    Register(rn),
19627                                    Operand(Register(rm),
19628                                            shift_operand.GetType(),
19629                                            shift_operand.GetAmount()));
19630                                if (((instr & 0xfff08000) != 0xeb000000)) {
19631                                  UnpredictableT32(instr);
19632                                }
19633                              } else {
19634                                UnallocatedT32(instr);
19635                              }
19636                              break;
19637                            }
19638                          }
19639                          break;
19640                        }
19641                      }
19642                      break;
19643                    }
19644                    case 0x00400000: {
19645                      // 0xeb400000
19646                      switch (instr & 0x000070f0) {
19647                        case 0x00000030: {
19648                          // 0xeb400030
19649                          unsigned rd = (instr >> 8) & 0xf;
19650                          unsigned rn = (instr >> 16) & 0xf;
19651                          unsigned rm = instr & 0xf;
19652                          // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19653                          adc(CurrentCond(),
19654                              Best,
19655                              Register(rd),
19656                              Register(rn),
19657                              Operand(Register(rm), RRX));
19658                          if (((instr & 0xfff0f0f0) != 0xeb400030)) {
19659                            UnpredictableT32(instr);
19660                          }
19661                          break;
19662                        }
19663                        default: {
19664                          if (((instr & 0x70f0) == 0x30)) {
19665                            UnallocatedT32(instr);
19666                            return;
19667                          }
19668                          unsigned rd = (instr >> 8) & 0xf;
19669                          unsigned rn = (instr >> 16) & 0xf;
19670                          unsigned rm = instr & 0xf;
19671                          ImmediateShiftOperand
19672                              shift_operand((instr >> 4) & 0x3,
19673                                            ((instr >> 6) & 0x3) |
19674                                                ((instr >> 10) & 0x1c));
19675                          if (InITBlock() &&
19676                              (instr & 0x00100000) == 0x00000000 &&
19677                              shift_operand.GetShift().IsLSL() &&
19678                              (shift_operand.GetAmount() == 0) &&
19679                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19680                               (rm < kNumberOfT32LowRegisters))) {
19681                            // ADC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19682                            adc(CurrentCond(),
19683                                Wide,
19684                                Register(rd),
19685                                Register(rn),
19686                                Register(rm));
19687                            if (((instr & 0xfff08000) != 0xeb400000)) {
19688                              UnpredictableT32(instr);
19689                            }
19690                          } else if ((instr & 0x00100000) == 0x00000000) {
19691                            // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19692                            adc(CurrentCond(),
19693                                Best,
19694                                Register(rd),
19695                                Register(rn),
19696                                Operand(Register(rm),
19697                                        shift_operand.GetType(),
19698                                        shift_operand.GetAmount()));
19699                            if (((instr & 0xfff08000) != 0xeb400000)) {
19700                              UnpredictableT32(instr);
19701                            }
19702                          } else {
19703                            UnallocatedT32(instr);
19704                          }
19705                          break;
19706                        }
19707                      }
19708                      break;
19709                    }
19710                    case 0x00600000: {
19711                      // 0xeb600000
19712                      switch (instr & 0x000070f0) {
19713                        case 0x00000030: {
19714                          // 0xeb600030
19715                          unsigned rd = (instr >> 8) & 0xf;
19716                          unsigned rn = (instr >> 16) & 0xf;
19717                          unsigned rm = instr & 0xf;
19718                          // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19719                          sbc(CurrentCond(),
19720                              Best,
19721                              Register(rd),
19722                              Register(rn),
19723                              Operand(Register(rm), RRX));
19724                          if (((instr & 0xfff0f0f0) != 0xeb600030)) {
19725                            UnpredictableT32(instr);
19726                          }
19727                          break;
19728                        }
19729                        default: {
19730                          if (((instr & 0x70f0) == 0x30)) {
19731                            UnallocatedT32(instr);
19732                            return;
19733                          }
19734                          unsigned rd = (instr >> 8) & 0xf;
19735                          unsigned rn = (instr >> 16) & 0xf;
19736                          unsigned rm = instr & 0xf;
19737                          ImmediateShiftOperand
19738                              shift_operand((instr >> 4) & 0x3,
19739                                            ((instr >> 6) & 0x3) |
19740                                                ((instr >> 10) & 0x1c));
19741                          if (InITBlock() &&
19742                              (instr & 0x00100000) == 0x00000000 &&
19743                              shift_operand.GetShift().IsLSL() &&
19744                              (shift_operand.GetAmount() == 0) &&
19745                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19746                               (rm < kNumberOfT32LowRegisters))) {
19747                            // SBC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19748                            sbc(CurrentCond(),
19749                                Wide,
19750                                Register(rd),
19751                                Register(rn),
19752                                Register(rm));
19753                            if (((instr & 0xfff08000) != 0xeb600000)) {
19754                              UnpredictableT32(instr);
19755                            }
19756                          } else if ((instr & 0x00100000) == 0x00000000) {
19757                            // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19758                            sbc(CurrentCond(),
19759                                Best,
19760                                Register(rd),
19761                                Register(rn),
19762                                Operand(Register(rm),
19763                                        shift_operand.GetType(),
19764                                        shift_operand.GetAmount()));
19765                            if (((instr & 0xfff08000) != 0xeb600000)) {
19766                              UnpredictableT32(instr);
19767                            }
19768                          } else {
19769                            UnallocatedT32(instr);
19770                          }
19771                          break;
19772                        }
19773                      }
19774                      break;
19775                    }
19776                    default:
19777                      UnallocatedT32(instr);
19778                      break;
19779                  }
19780                  break;
19781                }
19782                case 0x01100000: {
19783                  // 0xeb100000
19784                  switch (instr & 0x00600000) {
19785                    case 0x00000000: {
19786                      // 0xeb100000
19787                      switch (instr & 0x00000f00) {
19788                        case 0x00000f00: {
19789                          // 0xeb100f00
19790                          switch (instr & 0x000070f0) {
19791                            case 0x00000030: {
19792                              // 0xeb100f30
19793                              unsigned rn = (instr >> 16) & 0xf;
19794                              unsigned rm = instr & 0xf;
19795                              // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
19796                              cmn(CurrentCond(),
19797                                  Best,
19798                                  Register(rn),
19799                                  Operand(Register(rm), RRX));
19800                              if (((instr & 0xfff0fff0) != 0xeb100f30)) {
19801                                UnpredictableT32(instr);
19802                              }
19803                              break;
19804                            }
19805                            default: {
19806                              if (((instr & 0x70f0) == 0x30)) {
19807                                UnallocatedT32(instr);
19808                                return;
19809                              }
19810                              unsigned rn = (instr >> 16) & 0xf;
19811                              unsigned rm = instr & 0xf;
19812                              ImmediateShiftOperand
19813                                  shift_operand((instr >> 4) & 0x3,
19814                                                ((instr >> 6) & 0x3) |
19815                                                    ((instr >> 10) & 0x1c));
19816                              if (shift_operand.GetShift().IsLSL() &&
19817                                  (shift_operand.GetAmount() == 0) &&
19818                                  ((rn < kNumberOfT32LowRegisters) &&
19819                                   (rm < kNumberOfT32LowRegisters))) {
19820                                // CMN{<c>}.W <Rn>, <Rm> ; T2
19821                                cmn(CurrentCond(),
19822                                    Wide,
19823                                    Register(rn),
19824                                    Register(rm));
19825                                if (((instr & 0xfff08f00) != 0xeb100f00)) {
19826                                  UnpredictableT32(instr);
19827                                }
19828                              } else {
19829                                // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19830                                cmn(CurrentCond(),
19831                                    Best,
19832                                    Register(rn),
19833                                    Operand(Register(rm),
19834                                            shift_operand.GetType(),
19835                                            shift_operand.GetAmount()));
19836                                if (((instr & 0xfff08f00) != 0xeb100f00)) {
19837                                  UnpredictableT32(instr);
19838                                }
19839                              }
19840                              break;
19841                            }
19842                          }
19843                          break;
19844                        }
19845                        default: {
19846                          switch (instr & 0x000f0000) {
19847                            case 0x000d0000: {
19848                              // 0xeb1d0000
19849                              switch (instr & 0x000070f0) {
19850                                case 0x00000030: {
19851                                  // 0xeb1d0030
19852                                  if (((instr & 0xf00) == 0xf00)) {
19853                                    UnallocatedT32(instr);
19854                                    return;
19855                                  }
19856                                  unsigned rd = (instr >> 8) & 0xf;
19857                                  unsigned rm = instr & 0xf;
19858                                  // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
19859                                  adds(CurrentCond(),
19860                                       Best,
19861                                       Register(rd),
19862                                       sp,
19863                                       Operand(Register(rm), RRX));
19864                                  if (((instr & 0xfffff0f0) != 0xeb1d0030)) {
19865                                    UnpredictableT32(instr);
19866                                  }
19867                                  break;
19868                                }
19869                                default: {
19870                                  if (((instr & 0x70f0) == 0x30) ||
19871                                      ((instr & 0xf00) == 0xf00)) {
19872                                    UnallocatedT32(instr);
19873                                    return;
19874                                  }
19875                                  unsigned rd = (instr >> 8) & 0xf;
19876                                  unsigned rm = instr & 0xf;
19877                                  ImmediateShiftOperand
19878                                      shift_operand((instr >> 4) & 0x3,
19879                                                    ((instr >> 6) & 0x3) |
19880                                                        ((instr >> 10) & 0x1c));
19881                                  // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19882                                  adds(CurrentCond(),
19883                                       Best,
19884                                       Register(rd),
19885                                       sp,
19886                                       Operand(Register(rm),
19887                                               shift_operand.GetType(),
19888                                               shift_operand.GetAmount()));
19889                                  if (((instr & 0xffff8000) != 0xeb1d0000)) {
19890                                    UnpredictableT32(instr);
19891                                  }
19892                                  break;
19893                                }
19894                              }
19895                              break;
19896                            }
19897                            default: {
19898                              switch (instr & 0x000070f0) {
19899                                case 0x00000030: {
19900                                  // 0xeb100030
19901                                  if (((instr & 0xf0000) == 0xd0000) ||
19902                                      ((instr & 0xf00) == 0xf00)) {
19903                                    UnallocatedT32(instr);
19904                                    return;
19905                                  }
19906                                  unsigned rd = (instr >> 8) & 0xf;
19907                                  unsigned rn = (instr >> 16) & 0xf;
19908                                  unsigned rm = instr & 0xf;
19909                                  // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
19910                                  adds(CurrentCond(),
19911                                       Best,
19912                                       Register(rd),
19913                                       Register(rn),
19914                                       Operand(Register(rm), RRX));
19915                                  if (((instr & 0xfff0f0f0) != 0xeb100030)) {
19916                                    UnpredictableT32(instr);
19917                                  }
19918                                  break;
19919                                }
19920                                default: {
19921                                  if (((instr & 0xf0000) == 0xd0000) ||
19922                                      ((instr & 0x70f0) == 0x30) ||
19923                                      ((instr & 0xf00) == 0xf00)) {
19924                                    UnallocatedT32(instr);
19925                                    return;
19926                                  }
19927                                  unsigned rd = (instr >> 8) & 0xf;
19928                                  unsigned rn = (instr >> 16) & 0xf;
19929                                  unsigned rm = instr & 0xf;
19930                                  ImmediateShiftOperand
19931                                      shift_operand((instr >> 4) & 0x3,
19932                                                    ((instr >> 6) & 0x3) |
19933                                                        ((instr >> 10) & 0x1c));
19934                                  if (OutsideITBlock() &&
19935                                      (instr & 0x00100000) == 0x00100000 &&
19936                                      shift_operand.GetShift().IsLSL() &&
19937                                      (shift_operand.GetAmount() == 0) &&
19938                                      ((rd < kNumberOfT32LowRegisters) &&
19939                                       (rn < kNumberOfT32LowRegisters) &&
19940                                       (rm < kNumberOfT32LowRegisters))) {
19941                                    // ADDS.W {<Rd>}, <Rn>, <Rm> ; T3
19942                                    adds(Condition::None(),
19943                                         Wide,
19944                                         Register(rd),
19945                                         Register(rn),
19946                                         Register(rm));
19947                                    if (((instr & 0xfff08000) != 0xeb100000)) {
19948                                      UnpredictableT32(instr);
19949                                    }
19950                                  } else if ((instr & 0x00100000) ==
19951                                             0x00100000) {
19952                                    // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19953                                    adds(CurrentCond(),
19954                                         Best,
19955                                         Register(rd),
19956                                         Register(rn),
19957                                         Operand(Register(rm),
19958                                                 shift_operand.GetType(),
19959                                                 shift_operand.GetAmount()));
19960                                    if (((instr & 0xfff08000) != 0xeb100000)) {
19961                                      UnpredictableT32(instr);
19962                                    }
19963                                  } else {
19964                                    UnallocatedT32(instr);
19965                                  }
19966                                  break;
19967                                }
19968                              }
19969                              break;
19970                            }
19971                          }
19972                          break;
19973                        }
19974                      }
19975                      break;
19976                    }
19977                    case 0x00400000: {
19978                      // 0xeb500000
19979                      switch (instr & 0x000070f0) {
19980                        case 0x00000030: {
19981                          // 0xeb500030
19982                          unsigned rd = (instr >> 8) & 0xf;
19983                          unsigned rn = (instr >> 16) & 0xf;
19984                          unsigned rm = instr & 0xf;
19985                          // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19986                          adcs(CurrentCond(),
19987                               Best,
19988                               Register(rd),
19989                               Register(rn),
19990                               Operand(Register(rm), RRX));
19991                          if (((instr & 0xfff0f0f0) != 0xeb500030)) {
19992                            UnpredictableT32(instr);
19993                          }
19994                          break;
19995                        }
19996                        default: {
19997                          if (((instr & 0x70f0) == 0x30)) {
19998                            UnallocatedT32(instr);
19999                            return;
20000                          }
20001                          unsigned rd = (instr >> 8) & 0xf;
20002                          unsigned rn = (instr >> 16) & 0xf;
20003                          unsigned rm = instr & 0xf;
20004                          ImmediateShiftOperand
20005                              shift_operand((instr >> 4) & 0x3,
20006                                            ((instr >> 6) & 0x3) |
20007                                                ((instr >> 10) & 0x1c));
20008                          if (OutsideITBlock() &&
20009                              (instr & 0x00100000) == 0x00100000 &&
20010                              shift_operand.GetShift().IsLSL() &&
20011                              (shift_operand.GetAmount() == 0) &&
20012                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
20013                               (rm < kNumberOfT32LowRegisters))) {
20014                            // ADCS.W {<Rd>}, <Rn>, <Rm> ; T2
20015                            adcs(Condition::None(),
20016                                 Wide,
20017                                 Register(rd),
20018                                 Register(rn),
20019                                 Register(rm));
20020                            if (((instr & 0xfff08000) != 0xeb500000)) {
20021                              UnpredictableT32(instr);
20022                            }
20023                          } else if ((instr & 0x00100000) == 0x00100000) {
20024                            // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20025                            adcs(CurrentCond(),
20026                                 Best,
20027                                 Register(rd),
20028                                 Register(rn),
20029                                 Operand(Register(rm),
20030                                         shift_operand.GetType(),
20031                                         shift_operand.GetAmount()));
20032                            if (((instr & 0xfff08000) != 0xeb500000)) {
20033                              UnpredictableT32(instr);
20034                            }
20035                          } else {
20036                            UnallocatedT32(instr);
20037                          }
20038                          break;
20039                        }
20040                      }
20041                      break;
20042                    }
20043                    case 0x00600000: {
20044                      // 0xeb700000
20045                      switch (instr & 0x000070f0) {
20046                        case 0x00000030: {
20047                          // 0xeb700030
20048                          unsigned rd = (instr >> 8) & 0xf;
20049                          unsigned rn = (instr >> 16) & 0xf;
20050                          unsigned rm = instr & 0xf;
20051                          // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20052                          sbcs(CurrentCond(),
20053                               Best,
20054                               Register(rd),
20055                               Register(rn),
20056                               Operand(Register(rm), RRX));
20057                          if (((instr & 0xfff0f0f0) != 0xeb700030)) {
20058                            UnpredictableT32(instr);
20059                          }
20060                          break;
20061                        }
20062                        default: {
20063                          if (((instr & 0x70f0) == 0x30)) {
20064                            UnallocatedT32(instr);
20065                            return;
20066                          }
20067                          unsigned rd = (instr >> 8) & 0xf;
20068                          unsigned rn = (instr >> 16) & 0xf;
20069                          unsigned rm = instr & 0xf;
20070                          ImmediateShiftOperand
20071                              shift_operand((instr >> 4) & 0x3,
20072                                            ((instr >> 6) & 0x3) |
20073                                                ((instr >> 10) & 0x1c));
20074                          if (OutsideITBlock() &&
20075                              (instr & 0x00100000) == 0x00100000 &&
20076                              shift_operand.GetShift().IsLSL() &&
20077                              (shift_operand.GetAmount() == 0) &&
20078                              ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
20079                               (rm < kNumberOfT32LowRegisters))) {
20080                            // SBCS.W {<Rd>}, <Rn>, <Rm> ; T2
20081                            sbcs(Condition::None(),
20082                                 Wide,
20083                                 Register(rd),
20084                                 Register(rn),
20085                                 Register(rm));
20086                            if (((instr & 0xfff08000) != 0xeb700000)) {
20087                              UnpredictableT32(instr);
20088                            }
20089                          } else if ((instr & 0x00100000) == 0x00100000) {
20090                            // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20091                            sbcs(CurrentCond(),
20092                                 Best,
20093                                 Register(rd),
20094                                 Register(rn),
20095                                 Operand(Register(rm),
20096                                         shift_operand.GetType(),
20097                                         shift_operand.GetAmount()));
20098                            if (((instr & 0xfff08000) != 0xeb700000)) {
20099                              UnpredictableT32(instr);
20100                            }
20101                          } else {
20102                            UnallocatedT32(instr);
20103                          }
20104                          break;
20105                        }
20106                      }
20107                      break;
20108                    }
20109                    default:
20110                      UnallocatedT32(instr);
20111                      break;
20112                  }
20113                  break;
20114                }
20115                case 0x01800000: {
20116                  // 0xeb800000
20117                  switch (instr & 0x00600000) {
20118                    case 0x00200000: {
20119                      // 0xeba00000
20120                      switch (instr & 0x000f0000) {
20121                        case 0x000d0000: {
20122                          // 0xebad0000
20123                          switch (instr & 0x000070f0) {
20124                            case 0x00000030: {
20125                              // 0xebad0030
20126                              unsigned rd = (instr >> 8) & 0xf;
20127                              unsigned rm = instr & 0xf;
20128                              // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
20129                              sub(CurrentCond(),
20130                                  Best,
20131                                  Register(rd),
20132                                  sp,
20133                                  Operand(Register(rm), RRX));
20134                              if (((instr & 0xfffff0f0) != 0xebad0030)) {
20135                                UnpredictableT32(instr);
20136                              }
20137                              break;
20138                            }
20139                            default: {
20140                              if (((instr & 0x70f0) == 0x30)) {
20141                                UnallocatedT32(instr);
20142                                return;
20143                              }
20144                              unsigned rd = (instr >> 8) & 0xf;
20145                              unsigned rm = instr & 0xf;
20146                              ImmediateShiftOperand
20147                                  shift_operand((instr >> 4) & 0x3,
20148                                                ((instr >> 6) & 0x3) |
20149                                                    ((instr >> 10) & 0x1c));
20150                              if ((instr & 0x00100000) == 0x00000000 &&
20151                                  shift_operand.GetShift().IsLSL() &&
20152                                  (shift_operand.GetAmount() == 0)) {
20153                                // SUB{<c>} {<Rd>}, SP, <Rm> ; T1
20154                                sub(CurrentCond(),
20155                                    Best,
20156                                    Register(rd),
20157                                    sp,
20158                                    Register(rm));
20159                                if (((instr & 0xffff8000) != 0xebad0000)) {
20160                                  UnpredictableT32(instr);
20161                                }
20162                              } else if ((instr & 0x00100000) == 0x00000000) {
20163                                // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20164                                sub(CurrentCond(),
20165                                    Best,
20166                                    Register(rd),
20167                                    sp,
20168                                    Operand(Register(rm),
20169                                            shift_operand.GetType(),
20170                                            shift_operand.GetAmount()));
20171                                if (((instr & 0xffff8000) != 0xebad0000)) {
20172                                  UnpredictableT32(instr);
20173                                }
20174                              } else {
20175                                UnallocatedT32(instr);
20176                              }
20177                              break;
20178                            }
20179                          }
20180                          break;
20181                        }
20182                        default: {
20183                          switch (instr & 0x000070f0) {
20184                            case 0x00000030: {
20185                              // 0xeba00030
20186                              if (((instr & 0xf0000) == 0xd0000)) {
20187                                UnallocatedT32(instr);
20188                                return;
20189                              }
20190                              unsigned rd = (instr >> 8) & 0xf;
20191                              unsigned rn = (instr >> 16) & 0xf;
20192                              unsigned rm = instr & 0xf;
20193                              // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20194                              sub(CurrentCond(),
20195                                  Best,
20196                                  Register(rd),
20197                                  Register(rn),
20198                                  Operand(Register(rm), RRX));
20199                              if (((instr & 0xfff0f0f0) != 0xeba00030)) {
20200                                UnpredictableT32(instr);
20201                              }
20202                              break;
20203                            }
20204                            default: {
20205                              if (((instr & 0xf0000) == 0xd0000) ||
20206                                  ((instr & 0x70f0) == 0x30)) {
20207                                UnallocatedT32(instr);
20208                                return;
20209                              }
20210                              unsigned rd = (instr >> 8) & 0xf;
20211                              unsigned rn = (instr >> 16) & 0xf;
20212                              unsigned rm = instr & 0xf;
20213                              ImmediateShiftOperand
20214                                  shift_operand((instr >> 4) & 0x3,
20215                                                ((instr >> 6) & 0x3) |
20216                                                    ((instr >> 10) & 0x1c));
20217                              if (InITBlock() &&
20218                                  (instr & 0x00100000) == 0x00000000 &&
20219                                  shift_operand.GetShift().IsLSL() &&
20220                                  (shift_operand.GetAmount() == 0) &&
20221                                  ((rd < kNumberOfT32LowRegisters) &&
20222                                   (rn < kNumberOfT32LowRegisters) &&
20223                                   (rm < kNumberOfT32LowRegisters))) {
20224                                // SUB<c>.W {<Rd>}, <Rn>, <Rm> ; T2
20225                                sub(CurrentCond(),
20226                                    Wide,
20227                                    Register(rd),
20228                                    Register(rn),
20229                                    Register(rm));
20230                                if (((instr & 0xfff08000) != 0xeba00000)) {
20231                                  UnpredictableT32(instr);
20232                                }
20233                              } else if ((instr & 0x00100000) == 0x00000000) {
20234                                // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20235                                sub(CurrentCond(),
20236                                    Best,
20237                                    Register(rd),
20238                                    Register(rn),
20239                                    Operand(Register(rm),
20240                                            shift_operand.GetType(),
20241                                            shift_operand.GetAmount()));
20242                                if (((instr & 0xfff08000) != 0xeba00000)) {
20243                                  UnpredictableT32(instr);
20244                                }
20245                              } else {
20246                                UnallocatedT32(instr);
20247                              }
20248                              break;
20249                            }
20250                          }
20251                          break;
20252                        }
20253                      }
20254                      break;
20255                    }
20256                    case 0x00400000: {
20257                      // 0xebc00000
20258                      switch (instr & 0x000070f0) {
20259                        case 0x00000030: {
20260                          // 0xebc00030
20261                          unsigned rd = (instr >> 8) & 0xf;
20262                          unsigned rn = (instr >> 16) & 0xf;
20263                          unsigned rm = instr & 0xf;
20264                          // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
20265                          rsb(CurrentCond(),
20266                              Best,
20267                              Register(rd),
20268                              Register(rn),
20269                              Operand(Register(rm), RRX));
20270                          if (((instr & 0xfff0f0f0) != 0xebc00030)) {
20271                            UnpredictableT32(instr);
20272                          }
20273                          break;
20274                        }
20275                        default: {
20276                          if (((instr & 0x70f0) == 0x30)) {
20277                            UnallocatedT32(instr);
20278                            return;
20279                          }
20280                          unsigned rd = (instr >> 8) & 0xf;
20281                          unsigned rn = (instr >> 16) & 0xf;
20282                          unsigned rm = instr & 0xf;
20283                          ImmediateShiftOperand
20284                              shift_operand((instr >> 4) & 0x3,
20285                                            ((instr >> 6) & 0x3) |
20286                                                ((instr >> 10) & 0x1c));
20287                          // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20288                          rsb(CurrentCond(),
20289                              Best,
20290                              Register(rd),
20291                              Register(rn),
20292                              Operand(Register(rm),
20293                                      shift_operand.GetType(),
20294                                      shift_operand.GetAmount()));
20295                          if (((instr & 0xfff08000) != 0xebc00000)) {
20296                            UnpredictableT32(instr);
20297                          }
20298                          break;
20299                        }
20300                      }
20301                      break;
20302                    }
20303                    default:
20304                      UnallocatedT32(instr);
20305                      break;
20306                  }
20307                  break;
20308                }
20309                case 0x01900000: {
20310                  // 0xeb900000
20311                  switch (instr & 0x00600000) {
20312                    case 0x00200000: {
20313                      // 0xebb00000
20314                      switch (instr & 0x00000f00) {
20315                        case 0x00000f00: {
20316                          // 0xebb00f00
20317                          switch (instr & 0x000070f0) {
20318                            case 0x00000030: {
20319                              // 0xebb00f30
20320                              unsigned rn = (instr >> 16) & 0xf;
20321                              unsigned rm = instr & 0xf;
20322                              // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; T3
20323                              cmp(CurrentCond(),
20324                                  Best,
20325                                  Register(rn),
20326                                  Operand(Register(rm), RRX));
20327                              if (((instr & 0xfff0fff0) != 0xebb00f30)) {
20328                                UnpredictableT32(instr);
20329                              }
20330                              break;
20331                            }
20332                            default: {
20333                              if (((instr & 0x70f0) == 0x30)) {
20334                                UnallocatedT32(instr);
20335                                return;
20336                              }
20337                              unsigned rn = (instr >> 16) & 0xf;
20338                              unsigned rm = instr & 0xf;
20339                              ImmediateShiftOperand
20340                                  shift_operand((instr >> 4) & 0x3,
20341                                                ((instr >> 6) & 0x3) |
20342                                                    ((instr >> 10) & 0x1c));
20343                              if (shift_operand.GetShift().IsLSL() &&
20344                                  (shift_operand.GetAmount() == 0)) {
20345                                // CMP{<c>}.W <Rn>, <Rm> ; T3
20346                                cmp(CurrentCond(),
20347                                    Wide,
20348                                    Register(rn),
20349                                    Register(rm));
20350                                if (((instr & 0xfff08f00) != 0xebb00f00)) {
20351                                  UnpredictableT32(instr);
20352                                }
20353                              } else {
20354                                // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> #<amount> ; T3 NOLINT(whitespace/line_length)
20355                                cmp(CurrentCond(),
20356                                    Best,
20357                                    Register(rn),
20358                                    Operand(Register(rm),
20359                                            shift_operand.GetType(),
20360                                            shift_operand.GetAmount()));
20361                                if (((instr & 0xfff08f00) != 0xebb00f00)) {
20362                                  UnpredictableT32(instr);
20363                                }
20364                              }
20365                              break;
20366                            }
20367                          }
20368                          break;
20369                        }
20370                        default: {
20371                          switch (instr & 0x000f0000) {
20372                            case 0x000d0000: {
20373                              // 0xebbd0000
20374                              switch (instr & 0x000070f0) {
20375                                case 0x00000030: {
20376                                  // 0xebbd0030
20377                                  if (((instr & 0xf00) == 0xf00)) {
20378                                    UnallocatedT32(instr);
20379                                    return;
20380                                  }
20381                                  unsigned rd = (instr >> 8) & 0xf;
20382                                  unsigned rm = instr & 0xf;
20383                                  // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
20384                                  subs(CurrentCond(),
20385                                       Best,
20386                                       Register(rd),
20387                                       sp,
20388                                       Operand(Register(rm), RRX));
20389                                  if (((instr & 0xfffff0f0) != 0xebbd0030)) {
20390                                    UnpredictableT32(instr);
20391                                  }
20392                                  break;
20393                                }
20394                                default: {
20395                                  if (((instr & 0x70f0) == 0x30) ||
20396                                      ((instr & 0xf00) == 0xf00)) {
20397                                    UnallocatedT32(instr);
20398                                    return;
20399                                  }
20400                                  unsigned rd = (instr >> 8) & 0xf;
20401                                  unsigned rm = instr & 0xf;
20402                                  ImmediateShiftOperand
20403                                      shift_operand((instr >> 4) & 0x3,
20404                                                    ((instr >> 6) & 0x3) |
20405                                                        ((instr >> 10) & 0x1c));
20406                                  // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20407                                  subs(CurrentCond(),
20408                                       Best,
20409                                       Register(rd),
20410                                       sp,
20411                                       Operand(Register(rm),
20412                                               shift_operand.GetType(),
20413                                               shift_operand.GetAmount()));
20414                                  if (((instr & 0xffff8000) != 0xebbd0000)) {
20415                                    UnpredictableT32(instr);
20416                                  }
20417                                  break;
20418                                }
20419                              }
20420                              break;
20421                            }
20422                            default: {
20423                              switch (instr & 0x000070f0) {
20424                                case 0x00000030: {
20425                                  // 0xebb00030
20426                                  if (((instr & 0xf0000) == 0xd0000) ||
20427                                      ((instr & 0xf00) == 0xf00)) {
20428                                    UnallocatedT32(instr);
20429                                    return;
20430                                  }
20431                                  unsigned rd = (instr >> 8) & 0xf;
20432                                  unsigned rn = (instr >> 16) & 0xf;
20433                                  unsigned rm = instr & 0xf;
20434                                  // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20435                                  subs(CurrentCond(),
20436                                       Best,
20437                                       Register(rd),
20438                                       Register(rn),
20439                                       Operand(Register(rm), RRX));
20440                                  if (((instr & 0xfff0f0f0) != 0xebb00030)) {
20441                                    UnpredictableT32(instr);
20442                                  }
20443                                  break;
20444                                }
20445                                default: {
20446                                  if (((instr & 0xf0000) == 0xd0000) ||
20447                                      ((instr & 0x70f0) == 0x30) ||
20448                                      ((instr & 0xf00) == 0xf00)) {
20449                                    UnallocatedT32(instr);
20450                                    return;
20451                                  }
20452                                  unsigned rd = (instr >> 8) & 0xf;
20453                                  unsigned rn = (instr >> 16) & 0xf;
20454                                  unsigned rm = instr & 0xf;
20455                                  ImmediateShiftOperand
20456                                      shift_operand((instr >> 4) & 0x3,
20457                                                    ((instr >> 6) & 0x3) |
20458                                                        ((instr >> 10) & 0x1c));
20459                                  if (OutsideITBlock() &&
20460                                      (instr & 0x00100000) == 0x00100000 &&
20461                                      shift_operand.GetShift().IsLSL() &&
20462                                      (shift_operand.GetAmount() == 0) &&
20463                                      ((rd < kNumberOfT32LowRegisters) &&
20464                                       (rn < kNumberOfT32LowRegisters) &&
20465                                       (rm < kNumberOfT32LowRegisters))) {
20466                                    // SUBS.W {<Rd>}, <Rn>, <Rm> ; T2
20467                                    subs(Condition::None(),
20468                                         Wide,
20469                                         Register(rd),
20470                                         Register(rn),
20471                                         Register(rm));
20472                                    if (((instr & 0xfff08000) != 0xebb00000)) {
20473                                      UnpredictableT32(instr);
20474                                    }
20475                                  } else if ((instr & 0x00100000) ==
20476                                             0x00100000) {
20477                                    // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20478                                    subs(CurrentCond(),
20479                                         Best,
20480                                         Register(rd),
20481                                         Register(rn),
20482                                         Operand(Register(rm),
20483                                                 shift_operand.GetType(),
20484                                                 shift_operand.GetAmount()));
20485                                    if (((instr & 0xfff08000) != 0xebb00000)) {
20486                                      UnpredictableT32(instr);
20487                                    }
20488                                  } else {
20489                                    UnallocatedT32(instr);
20490                                  }
20491                                  break;
20492                                }
20493                              }
20494                              break;
20495                            }
20496                          }
20497                          break;
20498                        }
20499                      }
20500                      break;
20501                    }
20502                    case 0x00400000: {
20503                      // 0xebd00000
20504                      switch (instr & 0x000070f0) {
20505                        case 0x00000030: {
20506                          // 0xebd00030
20507                          unsigned rd = (instr >> 8) & 0xf;
20508                          unsigned rn = (instr >> 16) & 0xf;
20509                          unsigned rm = instr & 0xf;
20510                          // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
20511                          rsbs(CurrentCond(),
20512                               Best,
20513                               Register(rd),
20514                               Register(rn),
20515                               Operand(Register(rm), RRX));
20516                          if (((instr & 0xfff0f0f0) != 0xebd00030)) {
20517                            UnpredictableT32(instr);
20518                          }
20519                          break;
20520                        }
20521                        default: {
20522                          if (((instr & 0x70f0) == 0x30)) {
20523                            UnallocatedT32(instr);
20524                            return;
20525                          }
20526                          unsigned rd = (instr >> 8) & 0xf;
20527                          unsigned rn = (instr >> 16) & 0xf;
20528                          unsigned rm = instr & 0xf;
20529                          ImmediateShiftOperand
20530                              shift_operand((instr >> 4) & 0x3,
20531                                            ((instr >> 6) & 0x3) |
20532                                                ((instr >> 10) & 0x1c));
20533                          // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20534                          rsbs(CurrentCond(),
20535                               Best,
20536                               Register(rd),
20537                               Register(rn),
20538                               Operand(Register(rm),
20539                                       shift_operand.GetType(),
20540                                       shift_operand.GetAmount()));
20541                          if (((instr & 0xfff08000) != 0xebd00000)) {
20542                            UnpredictableT32(instr);
20543                          }
20544                          break;
20545                        }
20546                      }
20547                      break;
20548                    }
20549                    default:
20550                      UnallocatedT32(instr);
20551                      break;
20552                  }
20553                  break;
20554                }
20555                case 0x10000000: {
20556                  // 0xfa000000
20557                  switch (instr & 0x0000f080) {
20558                    case 0x0000f000: {
20559                      // 0xfa00f000
20560                      if ((instr & 0x00000070) == 0x00000000) {
20561                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20562                             Uint32(0x2))) {
20563                          unsigned rd = (instr >> 8) & 0xf;
20564                          unsigned rm = (instr >> 16) & 0xf;
20565                          unsigned rs = instr & 0xf;
20566                          if (InITBlock() &&
20567                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20568                               (rs < kNumberOfT32LowRegisters))) {
20569                            // ASR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20570                            asr(CurrentCond(),
20571                                Wide,
20572                                Register(rd),
20573                                Register(rm),
20574                                Register(rs));
20575                          } else {
20576                            // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20577                            asr(CurrentCond(),
20578                                Best,
20579                                Register(rd),
20580                                Register(rm),
20581                                Register(rs));
20582                          }
20583                          return;
20584                        }
20585                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20586                             Uint32(0x0))) {
20587                          unsigned rd = (instr >> 8) & 0xf;
20588                          unsigned rm = (instr >> 16) & 0xf;
20589                          unsigned rs = instr & 0xf;
20590                          if (InITBlock() &&
20591                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20592                               (rs < kNumberOfT32LowRegisters))) {
20593                            // LSL<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20594                            lsl(CurrentCond(),
20595                                Wide,
20596                                Register(rd),
20597                                Register(rm),
20598                                Register(rs));
20599                          } else {
20600                            // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20601                            lsl(CurrentCond(),
20602                                Best,
20603                                Register(rd),
20604                                Register(rm),
20605                                Register(rs));
20606                          }
20607                          return;
20608                        }
20609                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20610                             Uint32(0x1))) {
20611                          unsigned rd = (instr >> 8) & 0xf;
20612                          unsigned rm = (instr >> 16) & 0xf;
20613                          unsigned rs = instr & 0xf;
20614                          if (InITBlock() &&
20615                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20616                               (rs < kNumberOfT32LowRegisters))) {
20617                            // LSR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20618                            lsr(CurrentCond(),
20619                                Wide,
20620                                Register(rd),
20621                                Register(rm),
20622                                Register(rs));
20623                          } else {
20624                            // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20625                            lsr(CurrentCond(),
20626                                Best,
20627                                Register(rd),
20628                                Register(rm),
20629                                Register(rs));
20630                          }
20631                          return;
20632                        }
20633                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20634                             Uint32(0x3))) {
20635                          unsigned rd = (instr >> 8) & 0xf;
20636                          unsigned rm = (instr >> 16) & 0xf;
20637                          unsigned rs = instr & 0xf;
20638                          if (InITBlock() &&
20639                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20640                               (rs < kNumberOfT32LowRegisters))) {
20641                            // ROR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20642                            ror(CurrentCond(),
20643                                Wide,
20644                                Register(rd),
20645                                Register(rm),
20646                                Register(rs));
20647                          } else {
20648                            // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20649                            ror(CurrentCond(),
20650                                Best,
20651                                Register(rd),
20652                                Register(rm),
20653                                Register(rs));
20654                          }
20655                          return;
20656                        }
20657                        unsigned rd = (instr >> 8) & 0xf;
20658                        unsigned rm = (instr >> 16) & 0xf;
20659                        Shift shift((instr >> 21) & 0x3);
20660                        unsigned rs = instr & 0xf;
20661                        if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
20662                            ((rd < kNumberOfT32LowRegisters) &&
20663                             (rm < kNumberOfT32LowRegisters) &&
20664                             (rs < kNumberOfT32LowRegisters))) {
20665                          // MOV<c>.W <Rd>, <Rm>, <shift> <Rs> ; T2
20666                          mov(CurrentCond(),
20667                              Wide,
20668                              Register(rd),
20669                              Operand(Register(rm),
20670                                      shift.GetType(),
20671                                      Register(rs)));
20672                        } else if ((instr & 0x00100000) == 0x00000000) {
20673                          // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
20674                          mov(CurrentCond(),
20675                              Best,
20676                              Register(rd),
20677                              Operand(Register(rm),
20678                                      shift.GetType(),
20679                                      Register(rs)));
20680                        } else {
20681                          UnallocatedT32(instr);
20682                        }
20683                      } else {
20684                        UnallocatedT32(instr);
20685                      }
20686                      break;
20687                    }
20688                    case 0x0000f080: {
20689                      // 0xfa00f080
20690                      switch (instr & 0x00600000) {
20691                        case 0x00000000: {
20692                          // 0xfa00f080
20693                          switch (instr & 0x000f0000) {
20694                            case 0x000f0000: {
20695                              // 0xfa0ff080
20696                              unsigned rd = (instr >> 8) & 0xf;
20697                              unsigned rm = instr & 0xf;
20698                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20699                              if ((amount == 0) &&
20700                                  ((rd < kNumberOfT32LowRegisters) &&
20701                                   (rm < kNumberOfT32LowRegisters))) {
20702                                // SXTH{<c>}.W {<Rd>}, <Rm> ; T2
20703                                sxth(CurrentCond(),
20704                                     Wide,
20705                                     Register(rd),
20706                                     Register(rm));
20707                                if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
20708                                  UnpredictableT32(instr);
20709                                }
20710                              } else {
20711                                // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20712                                sxth(CurrentCond(),
20713                                     Best,
20714                                     Register(rd),
20715                                     Operand(Register(rm), ROR, amount));
20716                                if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
20717                                  UnpredictableT32(instr);
20718                                }
20719                              }
20720                              break;
20721                            }
20722                            default: {
20723                              if (((instr & 0xf0000) == 0xf0000)) {
20724                                UnallocatedT32(instr);
20725                                return;
20726                              }
20727                              unsigned rd = (instr >> 8) & 0xf;
20728                              unsigned rn = (instr >> 16) & 0xf;
20729                              unsigned rm = instr & 0xf;
20730                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20731                              // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20732                              sxtah(CurrentCond(),
20733                                    Register(rd),
20734                                    Register(rn),
20735                                    Operand(Register(rm), ROR, amount));
20736                              if (((instr & 0xfff0f0c0) != 0xfa00f080)) {
20737                                UnpredictableT32(instr);
20738                              }
20739                              break;
20740                            }
20741                          }
20742                          break;
20743                        }
20744                        case 0x00200000: {
20745                          // 0xfa20f080
20746                          switch (instr & 0x000f0000) {
20747                            case 0x000f0000: {
20748                              // 0xfa2ff080
20749                              unsigned rd = (instr >> 8) & 0xf;
20750                              unsigned rm = instr & 0xf;
20751                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20752                              // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20753                              sxtb16(CurrentCond(),
20754                                     Register(rd),
20755                                     Operand(Register(rm), ROR, amount));
20756                              if (((instr & 0xfffff0c0) != 0xfa2ff080)) {
20757                                UnpredictableT32(instr);
20758                              }
20759                              break;
20760                            }
20761                            default: {
20762                              if (((instr & 0xf0000) == 0xf0000)) {
20763                                UnallocatedT32(instr);
20764                                return;
20765                              }
20766                              unsigned rd = (instr >> 8) & 0xf;
20767                              unsigned rn = (instr >> 16) & 0xf;
20768                              unsigned rm = instr & 0xf;
20769                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20770                              // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20771                              sxtab16(CurrentCond(),
20772                                      Register(rd),
20773                                      Register(rn),
20774                                      Operand(Register(rm), ROR, amount));
20775                              if (((instr & 0xfff0f0c0) != 0xfa20f080)) {
20776                                UnpredictableT32(instr);
20777                              }
20778                              break;
20779                            }
20780                          }
20781                          break;
20782                        }
20783                        case 0x00400000: {
20784                          // 0xfa40f080
20785                          switch (instr & 0x000f0000) {
20786                            case 0x000f0000: {
20787                              // 0xfa4ff080
20788                              unsigned rd = (instr >> 8) & 0xf;
20789                              unsigned rm = instr & 0xf;
20790                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20791                              if ((amount == 0) &&
20792                                  ((rd < kNumberOfT32LowRegisters) &&
20793                                   (rm < kNumberOfT32LowRegisters))) {
20794                                // SXTB{<c>}.W {<Rd>}, <Rm> ; T2
20795                                sxtb(CurrentCond(),
20796                                     Wide,
20797                                     Register(rd),
20798                                     Register(rm));
20799                                if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
20800                                  UnpredictableT32(instr);
20801                                }
20802                              } else {
20803                                // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20804                                sxtb(CurrentCond(),
20805                                     Best,
20806                                     Register(rd),
20807                                     Operand(Register(rm), ROR, amount));
20808                                if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
20809                                  UnpredictableT32(instr);
20810                                }
20811                              }
20812                              break;
20813                            }
20814                            default: {
20815                              if (((instr & 0xf0000) == 0xf0000)) {
20816                                UnallocatedT32(instr);
20817                                return;
20818                              }
20819                              unsigned rd = (instr >> 8) & 0xf;
20820                              unsigned rn = (instr >> 16) & 0xf;
20821                              unsigned rm = instr & 0xf;
20822                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20823                              // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20824                              sxtab(CurrentCond(),
20825                                    Register(rd),
20826                                    Register(rn),
20827                                    Operand(Register(rm), ROR, amount));
20828                              if (((instr & 0xfff0f0c0) != 0xfa40f080)) {
20829                                UnpredictableT32(instr);
20830                              }
20831                              break;
20832                            }
20833                          }
20834                          break;
20835                        }
20836                        default:
20837                          UnallocatedT32(instr);
20838                          break;
20839                      }
20840                      break;
20841                    }
20842                    default:
20843                      UnallocatedT32(instr);
20844                      break;
20845                  }
20846                  break;
20847                }
20848                case 0x10100000: {
20849                  // 0xfa100000
20850                  switch (instr & 0x0000f080) {
20851                    case 0x0000f000: {
20852                      // 0xfa10f000
20853                      if ((instr & 0x00000070) == 0x00000000) {
20854                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20855                             Uint32(0x2))) {
20856                          unsigned rd = (instr >> 8) & 0xf;
20857                          unsigned rm = (instr >> 16) & 0xf;
20858                          unsigned rs = instr & 0xf;
20859                          if (OutsideITBlock() &&
20860                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20861                               (rs < kNumberOfT32LowRegisters))) {
20862                            // ASRS.W {<Rd>}, <Rm>, <Rs> ; T2
20863                            asrs(Condition::None(),
20864                                 Wide,
20865                                 Register(rd),
20866                                 Register(rm),
20867                                 Register(rs));
20868                          } else {
20869                            // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20870                            asrs(CurrentCond(),
20871                                 Best,
20872                                 Register(rd),
20873                                 Register(rm),
20874                                 Register(rs));
20875                          }
20876                          return;
20877                        }
20878                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20879                             Uint32(0x0))) {
20880                          unsigned rd = (instr >> 8) & 0xf;
20881                          unsigned rm = (instr >> 16) & 0xf;
20882                          unsigned rs = instr & 0xf;
20883                          if (OutsideITBlock() &&
20884                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20885                               (rs < kNumberOfT32LowRegisters))) {
20886                            // LSLS.W {<Rd>}, <Rm>, <Rs> ; T2
20887                            lsls(Condition::None(),
20888                                 Wide,
20889                                 Register(rd),
20890                                 Register(rm),
20891                                 Register(rs));
20892                          } else {
20893                            // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20894                            lsls(CurrentCond(),
20895                                 Best,
20896                                 Register(rd),
20897                                 Register(rm),
20898                                 Register(rs));
20899                          }
20900                          return;
20901                        }
20902                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20903                             Uint32(0x1))) {
20904                          unsigned rd = (instr >> 8) & 0xf;
20905                          unsigned rm = (instr >> 16) & 0xf;
20906                          unsigned rs = instr & 0xf;
20907                          if (OutsideITBlock() &&
20908                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20909                               (rs < kNumberOfT32LowRegisters))) {
20910                            // LSRS.W {<Rd>}, <Rm>, <Rs> ; T2
20911                            lsrs(Condition::None(),
20912                                 Wide,
20913                                 Register(rd),
20914                                 Register(rm),
20915                                 Register(rs));
20916                          } else {
20917                            // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20918                            lsrs(CurrentCond(),
20919                                 Best,
20920                                 Register(rd),
20921                                 Register(rm),
20922                                 Register(rs));
20923                          }
20924                          return;
20925                        }
20926                        if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20927                             Uint32(0x3))) {
20928                          unsigned rd = (instr >> 8) & 0xf;
20929                          unsigned rm = (instr >> 16) & 0xf;
20930                          unsigned rs = instr & 0xf;
20931                          if (OutsideITBlock() &&
20932                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20933                               (rs < kNumberOfT32LowRegisters))) {
20934                            // RORS.W {<Rd>}, <Rm>, <Rs> ; T2
20935                            rors(Condition::None(),
20936                                 Wide,
20937                                 Register(rd),
20938                                 Register(rm),
20939                                 Register(rs));
20940                          } else {
20941                            // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20942                            rors(CurrentCond(),
20943                                 Best,
20944                                 Register(rd),
20945                                 Register(rm),
20946                                 Register(rs));
20947                          }
20948                          return;
20949                        }
20950                        unsigned rd = (instr >> 8) & 0xf;
20951                        unsigned rm = (instr >> 16) & 0xf;
20952                        Shift shift((instr >> 21) & 0x3);
20953                        unsigned rs = instr & 0xf;
20954                        if (OutsideITBlock() &&
20955                            (instr & 0x00100000) == 0x00100000 &&
20956                            ((rd < kNumberOfT32LowRegisters) &&
20957                             (rm < kNumberOfT32LowRegisters) &&
20958                             (rs < kNumberOfT32LowRegisters))) {
20959                          // MOVS.W <Rd>, <Rm>, <shift> <Rs> ; T2
20960                          movs(Condition::None(),
20961                               Wide,
20962                               Register(rd),
20963                               Operand(Register(rm),
20964                                       shift.GetType(),
20965                                       Register(rs)));
20966                        } else if ((instr & 0x00100000) == 0x00100000) {
20967                          // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
20968                          movs(CurrentCond(),
20969                               Best,
20970                               Register(rd),
20971                               Operand(Register(rm),
20972                                       shift.GetType(),
20973                                       Register(rs)));
20974                        } else {
20975                          UnallocatedT32(instr);
20976                        }
20977                      } else {
20978                        UnallocatedT32(instr);
20979                      }
20980                      break;
20981                    }
20982                    case 0x0000f080: {
20983                      // 0xfa10f080
20984                      switch (instr & 0x00600000) {
20985                        case 0x00000000: {
20986                          // 0xfa10f080
20987                          switch (instr & 0x000f0000) {
20988                            case 0x000f0000: {
20989                              // 0xfa1ff080
20990                              unsigned rd = (instr >> 8) & 0xf;
20991                              unsigned rm = instr & 0xf;
20992                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
20993                              if ((amount == 0) &&
20994                                  ((rd < kNumberOfT32LowRegisters) &&
20995                                   (rm < kNumberOfT32LowRegisters))) {
20996                                // UXTH{<c>}.W {<Rd>}, <Rm> ; T2
20997                                uxth(CurrentCond(),
20998                                     Wide,
20999                                     Register(rd),
21000                                     Register(rm));
21001                                if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
21002                                  UnpredictableT32(instr);
21003                                }
21004                              } else {
21005                                // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
21006                                uxth(CurrentCond(),
21007                                     Best,
21008                                     Register(rd),
21009                                     Operand(Register(rm), ROR, amount));
21010                                if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
21011                                  UnpredictableT32(instr);
21012                                }
21013                              }
21014                              break;
21015                            }
21016                            default: {
21017                              if (((instr & 0xf0000) == 0xf0000)) {
21018                                UnallocatedT32(instr);
21019                                return;
21020                              }
21021                              unsigned rd = (instr >> 8) & 0xf;
21022                              unsigned rn = (instr >> 16) & 0xf;
21023                              unsigned rm = instr & 0xf;
21024                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21025                              // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21026                              uxtah(CurrentCond(),
21027                                    Register(rd),
21028                                    Register(rn),
21029                                    Operand(Register(rm), ROR, amount));
21030                              if (((instr & 0xfff0f0c0) != 0xfa10f080)) {
21031                                UnpredictableT32(instr);
21032                              }
21033                              break;
21034                            }
21035                          }
21036                          break;
21037                        }
21038                        case 0x00200000: {
21039                          // 0xfa30f080
21040                          switch (instr & 0x000f0000) {
21041                            case 0x000f0000: {
21042                              // 0xfa3ff080
21043                              unsigned rd = (instr >> 8) & 0xf;
21044                              unsigned rm = instr & 0xf;
21045                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21046                              // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21047                              uxtb16(CurrentCond(),
21048                                     Register(rd),
21049                                     Operand(Register(rm), ROR, amount));
21050                              if (((instr & 0xfffff0c0) != 0xfa3ff080)) {
21051                                UnpredictableT32(instr);
21052                              }
21053                              break;
21054                            }
21055                            default: {
21056                              if (((instr & 0xf0000) == 0xf0000)) {
21057                                UnallocatedT32(instr);
21058                                return;
21059                              }
21060                              unsigned rd = (instr >> 8) & 0xf;
21061                              unsigned rn = (instr >> 16) & 0xf;
21062                              unsigned rm = instr & 0xf;
21063                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21064                              // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21065                              uxtab16(CurrentCond(),
21066                                      Register(rd),
21067                                      Register(rn),
21068                                      Operand(Register(rm), ROR, amount));
21069                              if (((instr & 0xfff0f0c0) != 0xfa30f080)) {
21070                                UnpredictableT32(instr);
21071                              }
21072                              break;
21073                            }
21074                          }
21075                          break;
21076                        }
21077                        case 0x00400000: {
21078                          // 0xfa50f080
21079                          switch (instr & 0x000f0000) {
21080                            case 0x000f0000: {
21081                              // 0xfa5ff080
21082                              unsigned rd = (instr >> 8) & 0xf;
21083                              unsigned rm = instr & 0xf;
21084                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21085                              if ((amount == 0) &&
21086                                  ((rd < kNumberOfT32LowRegisters) &&
21087                                   (rm < kNumberOfT32LowRegisters))) {
21088                                // UXTB{<c>}.W {<Rd>}, <Rm> ; T2
21089                                uxtb(CurrentCond(),
21090                                     Wide,
21091                                     Register(rd),
21092                                     Register(rm));
21093                                if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
21094                                  UnpredictableT32(instr);
21095                                }
21096                              } else {
21097                                // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
21098                                uxtb(CurrentCond(),
21099                                     Best,
21100                                     Register(rd),
21101                                     Operand(Register(rm), ROR, amount));
21102                                if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
21103                                  UnpredictableT32(instr);
21104                                }
21105                              }
21106                              break;
21107                            }
21108                            default: {
21109                              if (((instr & 0xf0000) == 0xf0000)) {
21110                                UnallocatedT32(instr);
21111                                return;
21112                              }
21113                              unsigned rd = (instr >> 8) & 0xf;
21114                              unsigned rn = (instr >> 16) & 0xf;
21115                              unsigned rm = instr & 0xf;
21116                              uint32_t amount = ((instr >> 4) & 0x3) * 8;
21117                              // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21118                              uxtab(CurrentCond(),
21119                                    Register(rd),
21120                                    Register(rn),
21121                                    Operand(Register(rm), ROR, amount));
21122                              if (((instr & 0xfff0f0c0) != 0xfa50f080)) {
21123                                UnpredictableT32(instr);
21124                              }
21125                              break;
21126                            }
21127                          }
21128                          break;
21129                        }
21130                        default:
21131                          UnallocatedT32(instr);
21132                          break;
21133                      }
21134                      break;
21135                    }
21136                    default:
21137                      UnallocatedT32(instr);
21138                      break;
21139                  }
21140                  break;
21141                }
21142                case 0x10800000: {
21143                  // 0xfa800000
21144                  switch (instr & 0x0060f0f0) {
21145                    case 0x0000f000: {
21146                      // 0xfa80f000
21147                      unsigned rd = (instr >> 8) & 0xf;
21148                      unsigned rn = (instr >> 16) & 0xf;
21149                      unsigned rm = instr & 0xf;
21150                      // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21151                      sadd8(CurrentCond(),
21152                            Register(rd),
21153                            Register(rn),
21154                            Register(rm));
21155                      break;
21156                    }
21157                    case 0x0000f010: {
21158                      // 0xfa80f010
21159                      unsigned rd = (instr >> 8) & 0xf;
21160                      unsigned rn = (instr >> 16) & 0xf;
21161                      unsigned rm = instr & 0xf;
21162                      // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21163                      qadd8(CurrentCond(),
21164                            Register(rd),
21165                            Register(rn),
21166                            Register(rm));
21167                      break;
21168                    }
21169                    case 0x0000f020: {
21170                      // 0xfa80f020
21171                      unsigned rd = (instr >> 8) & 0xf;
21172                      unsigned rn = (instr >> 16) & 0xf;
21173                      unsigned rm = instr & 0xf;
21174                      // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21175                      shadd8(CurrentCond(),
21176                             Register(rd),
21177                             Register(rn),
21178                             Register(rm));
21179                      break;
21180                    }
21181                    case 0x0000f040: {
21182                      // 0xfa80f040
21183                      unsigned rd = (instr >> 8) & 0xf;
21184                      unsigned rn = (instr >> 16) & 0xf;
21185                      unsigned rm = instr & 0xf;
21186                      // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21187                      uadd8(CurrentCond(),
21188                            Register(rd),
21189                            Register(rn),
21190                            Register(rm));
21191                      break;
21192                    }
21193                    case 0x0000f050: {
21194                      // 0xfa80f050
21195                      unsigned rd = (instr >> 8) & 0xf;
21196                      unsigned rn = (instr >> 16) & 0xf;
21197                      unsigned rm = instr & 0xf;
21198                      // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21199                      uqadd8(CurrentCond(),
21200                             Register(rd),
21201                             Register(rn),
21202                             Register(rm));
21203                      break;
21204                    }
21205                    case 0x0000f060: {
21206                      // 0xfa80f060
21207                      unsigned rd = (instr >> 8) & 0xf;
21208                      unsigned rn = (instr >> 16) & 0xf;
21209                      unsigned rm = instr & 0xf;
21210                      // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21211                      uhadd8(CurrentCond(),
21212                             Register(rd),
21213                             Register(rn),
21214                             Register(rm));
21215                      break;
21216                    }
21217                    case 0x0000f080: {
21218                      // 0xfa80f080
21219                      unsigned rd = (instr >> 8) & 0xf;
21220                      unsigned rm = instr & 0xf;
21221                      unsigned rn = (instr >> 16) & 0xf;
21222                      // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21223                      qadd(CurrentCond(),
21224                           Register(rd),
21225                           Register(rm),
21226                           Register(rn));
21227                      break;
21228                    }
21229                    case 0x0000f090: {
21230                      // 0xfa80f090
21231                      unsigned rd = (instr >> 8) & 0xf;
21232                      unsigned rm = instr & 0xf;
21233                      unsigned rn = (instr >> 16) & 0xf;
21234                      // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21235                      qdadd(CurrentCond(),
21236                            Register(rd),
21237                            Register(rm),
21238                            Register(rn));
21239                      break;
21240                    }
21241                    case 0x0000f0a0: {
21242                      // 0xfa80f0a0
21243                      unsigned rd = (instr >> 8) & 0xf;
21244                      unsigned rm = instr & 0xf;
21245                      unsigned rn = (instr >> 16) & 0xf;
21246                      // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21247                      qsub(CurrentCond(),
21248                           Register(rd),
21249                           Register(rm),
21250                           Register(rn));
21251                      break;
21252                    }
21253                    case 0x0000f0b0: {
21254                      // 0xfa80f0b0
21255                      unsigned rd = (instr >> 8) & 0xf;
21256                      unsigned rm = instr & 0xf;
21257                      unsigned rn = (instr >> 16) & 0xf;
21258                      // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21259                      qdsub(CurrentCond(),
21260                            Register(rd),
21261                            Register(rm),
21262                            Register(rn));
21263                      break;
21264                    }
21265                    case 0x0020f000: {
21266                      // 0xfaa0f000
21267                      unsigned rd = (instr >> 8) & 0xf;
21268                      unsigned rn = (instr >> 16) & 0xf;
21269                      unsigned rm = instr & 0xf;
21270                      // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21271                      sasx(CurrentCond(),
21272                           Register(rd),
21273                           Register(rn),
21274                           Register(rm));
21275                      break;
21276                    }
21277                    case 0x0020f010: {
21278                      // 0xfaa0f010
21279                      unsigned rd = (instr >> 8) & 0xf;
21280                      unsigned rn = (instr >> 16) & 0xf;
21281                      unsigned rm = instr & 0xf;
21282                      // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21283                      qasx(CurrentCond(),
21284                           Register(rd),
21285                           Register(rn),
21286                           Register(rm));
21287                      break;
21288                    }
21289                    case 0x0020f020: {
21290                      // 0xfaa0f020
21291                      unsigned rd = (instr >> 8) & 0xf;
21292                      unsigned rn = (instr >> 16) & 0xf;
21293                      unsigned rm = instr & 0xf;
21294                      // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21295                      shasx(CurrentCond(),
21296                            Register(rd),
21297                            Register(rn),
21298                            Register(rm));
21299                      break;
21300                    }
21301                    case 0x0020f040: {
21302                      // 0xfaa0f040
21303                      unsigned rd = (instr >> 8) & 0xf;
21304                      unsigned rn = (instr >> 16) & 0xf;
21305                      unsigned rm = instr & 0xf;
21306                      // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21307                      uasx(CurrentCond(),
21308                           Register(rd),
21309                           Register(rn),
21310                           Register(rm));
21311                      break;
21312                    }
21313                    case 0x0020f050: {
21314                      // 0xfaa0f050
21315                      unsigned rd = (instr >> 8) & 0xf;
21316                      unsigned rn = (instr >> 16) & 0xf;
21317                      unsigned rm = instr & 0xf;
21318                      // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21319                      uqasx(CurrentCond(),
21320                            Register(rd),
21321                            Register(rn),
21322                            Register(rm));
21323                      break;
21324                    }
21325                    case 0x0020f060: {
21326                      // 0xfaa0f060
21327                      unsigned rd = (instr >> 8) & 0xf;
21328                      unsigned rn = (instr >> 16) & 0xf;
21329                      unsigned rm = instr & 0xf;
21330                      // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21331                      uhasx(CurrentCond(),
21332                            Register(rd),
21333                            Register(rn),
21334                            Register(rm));
21335                      break;
21336                    }
21337                    case 0x0020f080: {
21338                      // 0xfaa0f080
21339                      unsigned rd = (instr >> 8) & 0xf;
21340                      unsigned rn = (instr >> 16) & 0xf;
21341                      unsigned rm = instr & 0xf;
21342                      // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21343                      sel(CurrentCond(),
21344                          Register(rd),
21345                          Register(rn),
21346                          Register(rm));
21347                      break;
21348                    }
21349                    case 0x0040f000: {
21350                      // 0xfac0f000
21351                      unsigned rd = (instr >> 8) & 0xf;
21352                      unsigned rn = (instr >> 16) & 0xf;
21353                      unsigned rm = instr & 0xf;
21354                      // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21355                      ssub8(CurrentCond(),
21356                            Register(rd),
21357                            Register(rn),
21358                            Register(rm));
21359                      break;
21360                    }
21361                    case 0x0040f010: {
21362                      // 0xfac0f010
21363                      unsigned rd = (instr >> 8) & 0xf;
21364                      unsigned rn = (instr >> 16) & 0xf;
21365                      unsigned rm = instr & 0xf;
21366                      // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21367                      qsub8(CurrentCond(),
21368                            Register(rd),
21369                            Register(rn),
21370                            Register(rm));
21371                      break;
21372                    }
21373                    case 0x0040f020: {
21374                      // 0xfac0f020
21375                      unsigned rd = (instr >> 8) & 0xf;
21376                      unsigned rn = (instr >> 16) & 0xf;
21377                      unsigned rm = instr & 0xf;
21378                      // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21379                      shsub8(CurrentCond(),
21380                             Register(rd),
21381                             Register(rn),
21382                             Register(rm));
21383                      break;
21384                    }
21385                    case 0x0040f040: {
21386                      // 0xfac0f040
21387                      unsigned rd = (instr >> 8) & 0xf;
21388                      unsigned rn = (instr >> 16) & 0xf;
21389                      unsigned rm = instr & 0xf;
21390                      // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21391                      usub8(CurrentCond(),
21392                            Register(rd),
21393                            Register(rn),
21394                            Register(rm));
21395                      break;
21396                    }
21397                    case 0x0040f050: {
21398                      // 0xfac0f050
21399                      unsigned rd = (instr >> 8) & 0xf;
21400                      unsigned rn = (instr >> 16) & 0xf;
21401                      unsigned rm = instr & 0xf;
21402                      // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21403                      uqsub8(CurrentCond(),
21404                             Register(rd),
21405                             Register(rn),
21406                             Register(rm));
21407                      break;
21408                    }
21409                    case 0x0040f060: {
21410                      // 0xfac0f060
21411                      unsigned rd = (instr >> 8) & 0xf;
21412                      unsigned rn = (instr >> 16) & 0xf;
21413                      unsigned rm = instr & 0xf;
21414                      // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21415                      uhsub8(CurrentCond(),
21416                             Register(rd),
21417                             Register(rn),
21418                             Register(rm));
21419                      break;
21420                    }
21421                    case 0x0040f080: {
21422                      // 0xfac0f080
21423                      unsigned rd = (instr >> 8) & 0xf;
21424                      unsigned rn = (instr >> 16) & 0xf;
21425                      unsigned rm = instr & 0xf;
21426                      // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; T1
21427                      crc32b(Condition::None(),
21428                             Register(rd),
21429                             Register(rn),
21430                             Register(rm));
21431                      break;
21432                    }
21433                    case 0x0040f090: {
21434                      // 0xfac0f090
21435                      unsigned rd = (instr >> 8) & 0xf;
21436                      unsigned rn = (instr >> 16) & 0xf;
21437                      unsigned rm = instr & 0xf;
21438                      // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; T1
21439                      crc32h(Condition::None(),
21440                             Register(rd),
21441                             Register(rn),
21442                             Register(rm));
21443                      break;
21444                    }
21445                    case 0x0040f0a0: {
21446                      // 0xfac0f0a0
21447                      unsigned rd = (instr >> 8) & 0xf;
21448                      unsigned rn = (instr >> 16) & 0xf;
21449                      unsigned rm = instr & 0xf;
21450                      // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; T1
21451                      crc32w(Condition::None(),
21452                             Register(rd),
21453                             Register(rn),
21454                             Register(rm));
21455                      break;
21456                    }
21457                    case 0x0060f000: {
21458                      // 0xfae0f000
21459                      unsigned rd = (instr >> 8) & 0xf;
21460                      unsigned rn = (instr >> 16) & 0xf;
21461                      unsigned rm = instr & 0xf;
21462                      // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21463                      ssax(CurrentCond(),
21464                           Register(rd),
21465                           Register(rn),
21466                           Register(rm));
21467                      break;
21468                    }
21469                    case 0x0060f010: {
21470                      // 0xfae0f010
21471                      unsigned rd = (instr >> 8) & 0xf;
21472                      unsigned rn = (instr >> 16) & 0xf;
21473                      unsigned rm = instr & 0xf;
21474                      // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21475                      qsax(CurrentCond(),
21476                           Register(rd),
21477                           Register(rn),
21478                           Register(rm));
21479                      break;
21480                    }
21481                    case 0x0060f020: {
21482                      // 0xfae0f020
21483                      unsigned rd = (instr >> 8) & 0xf;
21484                      unsigned rn = (instr >> 16) & 0xf;
21485                      unsigned rm = instr & 0xf;
21486                      // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21487                      shsax(CurrentCond(),
21488                            Register(rd),
21489                            Register(rn),
21490                            Register(rm));
21491                      break;
21492                    }
21493                    case 0x0060f040: {
21494                      // 0xfae0f040
21495                      unsigned rd = (instr >> 8) & 0xf;
21496                      unsigned rn = (instr >> 16) & 0xf;
21497                      unsigned rm = instr & 0xf;
21498                      // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21499                      usax(CurrentCond(),
21500                           Register(rd),
21501                           Register(rn),
21502                           Register(rm));
21503                      break;
21504                    }
21505                    case 0x0060f050: {
21506                      // 0xfae0f050
21507                      unsigned rd = (instr >> 8) & 0xf;
21508                      unsigned rn = (instr >> 16) & 0xf;
21509                      unsigned rm = instr & 0xf;
21510                      // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21511                      uqsax(CurrentCond(),
21512                            Register(rd),
21513                            Register(rn),
21514                            Register(rm));
21515                      break;
21516                    }
21517                    case 0x0060f060: {
21518                      // 0xfae0f060
21519                      unsigned rd = (instr >> 8) & 0xf;
21520                      unsigned rn = (instr >> 16) & 0xf;
21521                      unsigned rm = instr & 0xf;
21522                      // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21523                      uhsax(CurrentCond(),
21524                            Register(rd),
21525                            Register(rn),
21526                            Register(rm));
21527                      break;
21528                    }
21529                    default:
21530                      UnallocatedT32(instr);
21531                      break;
21532                  }
21533                  break;
21534                }
21535                case 0x10900000: {
21536                  // 0xfa900000
21537                  switch (instr & 0x0060f0f0) {
21538                    case 0x0000f000: {
21539                      // 0xfa90f000
21540                      unsigned rd = (instr >> 8) & 0xf;
21541                      unsigned rn = (instr >> 16) & 0xf;
21542                      unsigned rm = instr & 0xf;
21543                      // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21544                      sadd16(CurrentCond(),
21545                             Register(rd),
21546                             Register(rn),
21547                             Register(rm));
21548                      break;
21549                    }
21550                    case 0x0000f010: {
21551                      // 0xfa90f010
21552                      unsigned rd = (instr >> 8) & 0xf;
21553                      unsigned rn = (instr >> 16) & 0xf;
21554                      unsigned rm = instr & 0xf;
21555                      // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21556                      qadd16(CurrentCond(),
21557                             Register(rd),
21558                             Register(rn),
21559                             Register(rm));
21560                      break;
21561                    }
21562                    case 0x0000f020: {
21563                      // 0xfa90f020
21564                      unsigned rd = (instr >> 8) & 0xf;
21565                      unsigned rn = (instr >> 16) & 0xf;
21566                      unsigned rm = instr & 0xf;
21567                      // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21568                      shadd16(CurrentCond(),
21569                              Register(rd),
21570                              Register(rn),
21571                              Register(rm));
21572                      break;
21573                    }
21574                    case 0x0000f040: {
21575                      // 0xfa90f040
21576                      unsigned rd = (instr >> 8) & 0xf;
21577                      unsigned rn = (instr >> 16) & 0xf;
21578                      unsigned rm = instr & 0xf;
21579                      // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21580                      uadd16(CurrentCond(),
21581                             Register(rd),
21582                             Register(rn),
21583                             Register(rm));
21584                      break;
21585                    }
21586                    case 0x0000f050: {
21587                      // 0xfa90f050
21588                      unsigned rd = (instr >> 8) & 0xf;
21589                      unsigned rn = (instr >> 16) & 0xf;
21590                      unsigned rm = instr & 0xf;
21591                      // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21592                      uqadd16(CurrentCond(),
21593                              Register(rd),
21594                              Register(rn),
21595                              Register(rm));
21596                      break;
21597                    }
21598                    case 0x0000f060: {
21599                      // 0xfa90f060
21600                      unsigned rd = (instr >> 8) & 0xf;
21601                      unsigned rn = (instr >> 16) & 0xf;
21602                      unsigned rm = instr & 0xf;
21603                      // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21604                      uhadd16(CurrentCond(),
21605                              Register(rd),
21606                              Register(rn),
21607                              Register(rm));
21608                      break;
21609                    }
21610                    case 0x0000f080: {
21611                      // 0xfa90f080
21612                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21613                        unsigned rd = (instr >> 8) & 0xf;
21614                        unsigned rm = instr & 0xf;
21615                        if ((rd < kNumberOfT32LowRegisters) &&
21616                            (rm < kNumberOfT32LowRegisters)) {
21617                          // REV{<c>}.W <Rd>, <Rm> ; T2
21618                          rev(CurrentCond(), Wide, Register(rd), Register(rm));
21619                        } else {
21620                          // REV{<c>}{<q>} <Rd>, <Rm> ; T2
21621                          rev(CurrentCond(), Best, Register(rd), Register(rm));
21622                        }
21623                      } else {
21624                        UnallocatedT32(instr);
21625                      }
21626                      break;
21627                    }
21628                    case 0x0000f090: {
21629                      // 0xfa90f090
21630                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21631                        unsigned rd = (instr >> 8) & 0xf;
21632                        unsigned rm = instr & 0xf;
21633                        if ((rd < kNumberOfT32LowRegisters) &&
21634                            (rm < kNumberOfT32LowRegisters)) {
21635                          // REV16{<c>}.W <Rd>, <Rm> ; T2
21636                          rev16(CurrentCond(),
21637                                Wide,
21638                                Register(rd),
21639                                Register(rm));
21640                        } else {
21641                          // REV16{<c>}{<q>} <Rd>, <Rm> ; T2
21642                          rev16(CurrentCond(),
21643                                Best,
21644                                Register(rd),
21645                                Register(rm));
21646                        }
21647                      } else {
21648                        UnallocatedT32(instr);
21649                      }
21650                      break;
21651                    }
21652                    case 0x0000f0a0: {
21653                      // 0xfa90f0a0
21654                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21655                        unsigned rd = (instr >> 8) & 0xf;
21656                        unsigned rm = instr & 0xf;
21657                        // RBIT{<c>}{<q>} <Rd>, <Rm> ; T1
21658                        rbit(CurrentCond(), Register(rd), Register(rm));
21659                      } else {
21660                        UnallocatedT32(instr);
21661                      }
21662                      break;
21663                    }
21664                    case 0x0000f0b0: {
21665                      // 0xfa90f0b0
21666                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21667                        unsigned rd = (instr >> 8) & 0xf;
21668                        unsigned rm = instr & 0xf;
21669                        if ((rd < kNumberOfT32LowRegisters) &&
21670                            (rm < kNumberOfT32LowRegisters)) {
21671                          // REVSH{<c>}.W <Rd>, <Rm> ; T2
21672                          revsh(CurrentCond(),
21673                                Wide,
21674                                Register(rd),
21675                                Register(rm));
21676                        } else {
21677                          // REVSH{<c>}{<q>} <Rd>, <Rm> ; T2
21678                          revsh(CurrentCond(),
21679                                Best,
21680                                Register(rd),
21681                                Register(rm));
21682                        }
21683                      } else {
21684                        UnallocatedT32(instr);
21685                      }
21686                      break;
21687                    }
21688                    case 0x0020f080: {
21689                      // 0xfab0f080
21690                      if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21691                        unsigned rd = (instr >> 8) & 0xf;
21692                        unsigned rm = instr & 0xf;
21693                        // CLZ{<c>}{<q>} <Rd>, <Rm> ; T1
21694                        clz(CurrentCond(), Register(rd), Register(rm));
21695                      } else {
21696                        UnallocatedT32(instr);
21697                      }
21698                      break;
21699                    }
21700                    case 0x0040f000: {
21701                      // 0xfad0f000
21702                      unsigned rd = (instr >> 8) & 0xf;
21703                      unsigned rn = (instr >> 16) & 0xf;
21704                      unsigned rm = instr & 0xf;
21705                      // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21706                      ssub16(CurrentCond(),
21707                             Register(rd),
21708                             Register(rn),
21709                             Register(rm));
21710                      break;
21711                    }
21712                    case 0x0040f010: {
21713                      // 0xfad0f010
21714                      unsigned rd = (instr >> 8) & 0xf;
21715                      unsigned rn = (instr >> 16) & 0xf;
21716                      unsigned rm = instr & 0xf;
21717                      // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21718                      qsub16(CurrentCond(),
21719                             Register(rd),
21720                             Register(rn),
21721                             Register(rm));
21722                      break;
21723                    }
21724                    case 0x0040f020: {
21725                      // 0xfad0f020
21726                      unsigned rd = (instr >> 8) & 0xf;
21727                      unsigned rn = (instr >> 16) & 0xf;
21728                      unsigned rm = instr & 0xf;
21729                      // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21730                      shsub16(CurrentCond(),
21731                              Register(rd),
21732                              Register(rn),
21733                              Register(rm));
21734                      break;
21735                    }
21736                    case 0x0040f040: {
21737                      // 0xfad0f040
21738                      unsigned rd = (instr >> 8) & 0xf;
21739                      unsigned rn = (instr >> 16) & 0xf;
21740                      unsigned rm = instr & 0xf;
21741                      // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21742                      usub16(CurrentCond(),
21743                             Register(rd),
21744                             Register(rn),
21745                             Register(rm));
21746                      break;
21747                    }
21748                    case 0x0040f050: {
21749                      // 0xfad0f050
21750                      unsigned rd = (instr >> 8) & 0xf;
21751                      unsigned rn = (instr >> 16) & 0xf;
21752                      unsigned rm = instr & 0xf;
21753                      // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21754                      uqsub16(CurrentCond(),
21755                              Register(rd),
21756                              Register(rn),
21757                              Register(rm));
21758                      break;
21759                    }
21760                    case 0x0040f060: {
21761                      // 0xfad0f060
21762                      unsigned rd = (instr >> 8) & 0xf;
21763                      unsigned rn = (instr >> 16) & 0xf;
21764                      unsigned rm = instr & 0xf;
21765                      // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21766                      uhsub16(CurrentCond(),
21767                              Register(rd),
21768                              Register(rn),
21769                              Register(rm));
21770                      break;
21771                    }
21772                    case 0x0040f080: {
21773                      // 0xfad0f080
21774                      unsigned rd = (instr >> 8) & 0xf;
21775                      unsigned rn = (instr >> 16) & 0xf;
21776                      unsigned rm = instr & 0xf;
21777                      // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; T1
21778                      crc32cb(Condition::None(),
21779                              Register(rd),
21780                              Register(rn),
21781                              Register(rm));
21782                      break;
21783                    }
21784                    case 0x0040f090: {
21785                      // 0xfad0f090
21786                      unsigned rd = (instr >> 8) & 0xf;
21787                      unsigned rn = (instr >> 16) & 0xf;
21788                      unsigned rm = instr & 0xf;
21789                      // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; T1
21790                      crc32ch(Condition::None(),
21791                              Register(rd),
21792                              Register(rn),
21793                              Register(rm));
21794                      break;
21795                    }
21796                    case 0x0040f0a0: {
21797                      // 0xfad0f0a0
21798                      unsigned rd = (instr >> 8) & 0xf;
21799                      unsigned rn = (instr >> 16) & 0xf;
21800                      unsigned rm = instr & 0xf;
21801                      // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; T1
21802                      crc32cw(Condition::None(),
21803                              Register(rd),
21804                              Register(rn),
21805                              Register(rm));
21806                      break;
21807                    }
21808                    default:
21809                      UnallocatedT32(instr);
21810                      break;
21811                  }
21812                  break;
21813                }
21814                case 0x11000000: {
21815                  // 0xfb000000
21816                  switch (instr & 0x006000f0) {
21817                    case 0x00000000: {
21818                      // 0xfb000000
21819                      switch (instr & 0x0000f000) {
21820                        case 0x0000f000: {
21821                          // 0xfb00f000
21822                          unsigned rd = (instr >> 8) & 0xf;
21823                          unsigned rn = (instr >> 16) & 0xf;
21824                          unsigned rm = instr & 0xf;
21825                          if (InITBlock() &&
21826                              ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
21827                               (rn < kNumberOfT32LowRegisters))) {
21828                            // MUL<c>.W <Rd>, <Rn>, {<Rm>} ; T2
21829                            mul(CurrentCond(),
21830                                Wide,
21831                                Register(rd),
21832                                Register(rn),
21833                                Register(rm));
21834                          } else {
21835                            // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; T2
21836                            mul(CurrentCond(),
21837                                Best,
21838                                Register(rd),
21839                                Register(rn),
21840                                Register(rm));
21841                          }
21842                          break;
21843                        }
21844                        default: {
21845                          if (((instr & 0xf000) == 0xf000)) {
21846                            UnallocatedT32(instr);
21847                            return;
21848                          }
21849                          unsigned rd = (instr >> 8) & 0xf;
21850                          unsigned rn = (instr >> 16) & 0xf;
21851                          unsigned rm = instr & 0xf;
21852                          unsigned ra = (instr >> 12) & 0xf;
21853                          // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21854                          mla(CurrentCond(),
21855                              Register(rd),
21856                              Register(rn),
21857                              Register(rm),
21858                              Register(ra));
21859                          break;
21860                        }
21861                      }
21862                      break;
21863                    }
21864                    case 0x00000010: {
21865                      // 0xfb000010
21866                      unsigned rd = (instr >> 8) & 0xf;
21867                      unsigned rn = (instr >> 16) & 0xf;
21868                      unsigned rm = instr & 0xf;
21869                      unsigned ra = (instr >> 12) & 0xf;
21870                      // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21871                      mls(CurrentCond(),
21872                          Register(rd),
21873                          Register(rn),
21874                          Register(rm),
21875                          Register(ra));
21876                      break;
21877                    }
21878                    case 0x00200000: {
21879                      // 0xfb200000
21880                      switch (instr & 0x0000f000) {
21881                        case 0x0000f000: {
21882                          // 0xfb20f000
21883                          unsigned rd = (instr >> 8) & 0xf;
21884                          unsigned rn = (instr >> 16) & 0xf;
21885                          unsigned rm = instr & 0xf;
21886                          // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21887                          smuad(CurrentCond(),
21888                                Register(rd),
21889                                Register(rn),
21890                                Register(rm));
21891                          break;
21892                        }
21893                        default: {
21894                          if (((instr & 0xf000) == 0xf000)) {
21895                            UnallocatedT32(instr);
21896                            return;
21897                          }
21898                          unsigned rd = (instr >> 8) & 0xf;
21899                          unsigned rn = (instr >> 16) & 0xf;
21900                          unsigned rm = instr & 0xf;
21901                          unsigned ra = (instr >> 12) & 0xf;
21902                          // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21903                          smlad(CurrentCond(),
21904                                Register(rd),
21905                                Register(rn),
21906                                Register(rm),
21907                                Register(ra));
21908                          break;
21909                        }
21910                      }
21911                      break;
21912                    }
21913                    case 0x00200010: {
21914                      // 0xfb200010
21915                      switch (instr & 0x0000f000) {
21916                        case 0x0000f000: {
21917                          // 0xfb20f010
21918                          unsigned rd = (instr >> 8) & 0xf;
21919                          unsigned rn = (instr >> 16) & 0xf;
21920                          unsigned rm = instr & 0xf;
21921                          // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21922                          smuadx(CurrentCond(),
21923                                 Register(rd),
21924                                 Register(rn),
21925                                 Register(rm));
21926                          break;
21927                        }
21928                        default: {
21929                          if (((instr & 0xf000) == 0xf000)) {
21930                            UnallocatedT32(instr);
21931                            return;
21932                          }
21933                          unsigned rd = (instr >> 8) & 0xf;
21934                          unsigned rn = (instr >> 16) & 0xf;
21935                          unsigned rm = instr & 0xf;
21936                          unsigned ra = (instr >> 12) & 0xf;
21937                          // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21938                          smladx(CurrentCond(),
21939                                 Register(rd),
21940                                 Register(rn),
21941                                 Register(rm),
21942                                 Register(ra));
21943                          break;
21944                        }
21945                      }
21946                      break;
21947                    }
21948                    case 0x00400000: {
21949                      // 0xfb400000
21950                      switch (instr & 0x0000f000) {
21951                        case 0x0000f000: {
21952                          // 0xfb40f000
21953                          unsigned rd = (instr >> 8) & 0xf;
21954                          unsigned rn = (instr >> 16) & 0xf;
21955                          unsigned rm = instr & 0xf;
21956                          // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21957                          smusd(CurrentCond(),
21958                                Register(rd),
21959                                Register(rn),
21960                                Register(rm));
21961                          break;
21962                        }
21963                        default: {
21964                          if (((instr & 0xf000) == 0xf000)) {
21965                            UnallocatedT32(instr);
21966                            return;
21967                          }
21968                          unsigned rd = (instr >> 8) & 0xf;
21969                          unsigned rn = (instr >> 16) & 0xf;
21970                          unsigned rm = instr & 0xf;
21971                          unsigned ra = (instr >> 12) & 0xf;
21972                          // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21973                          smlsd(CurrentCond(),
21974                                Register(rd),
21975                                Register(rn),
21976                                Register(rm),
21977                                Register(ra));
21978                          break;
21979                        }
21980                      }
21981                      break;
21982                    }
21983                    case 0x00400010: {
21984                      // 0xfb400010
21985                      switch (instr & 0x0000f000) {
21986                        case 0x0000f000: {
21987                          // 0xfb40f010
21988                          unsigned rd = (instr >> 8) & 0xf;
21989                          unsigned rn = (instr >> 16) & 0xf;
21990                          unsigned rm = instr & 0xf;
21991                          // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21992                          smusdx(CurrentCond(),
21993                                 Register(rd),
21994                                 Register(rn),
21995                                 Register(rm));
21996                          break;
21997                        }
21998                        default: {
21999                          if (((instr & 0xf000) == 0xf000)) {
22000                            UnallocatedT32(instr);
22001                            return;
22002                          }
22003                          unsigned rd = (instr >> 8) & 0xf;
22004                          unsigned rn = (instr >> 16) & 0xf;
22005                          unsigned rm = instr & 0xf;
22006                          unsigned ra = (instr >> 12) & 0xf;
22007                          // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22008                          smlsdx(CurrentCond(),
22009                                 Register(rd),
22010                                 Register(rn),
22011                                 Register(rm),
22012                                 Register(ra));
22013                          break;
22014                        }
22015                      }
22016                      break;
22017                    }
22018                    case 0x00600000: {
22019                      // 0xfb600000
22020                      unsigned rd = (instr >> 8) & 0xf;
22021                      unsigned rn = (instr >> 16) & 0xf;
22022                      unsigned rm = instr & 0xf;
22023                      unsigned ra = (instr >> 12) & 0xf;
22024                      // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22025                      smmls(CurrentCond(),
22026                            Register(rd),
22027                            Register(rn),
22028                            Register(rm),
22029                            Register(ra));
22030                      break;
22031                    }
22032                    case 0x00600010: {
22033                      // 0xfb600010
22034                      unsigned rd = (instr >> 8) & 0xf;
22035                      unsigned rn = (instr >> 16) & 0xf;
22036                      unsigned rm = instr & 0xf;
22037                      unsigned ra = (instr >> 12) & 0xf;
22038                      // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22039                      smmlsr(CurrentCond(),
22040                             Register(rd),
22041                             Register(rn),
22042                             Register(rm),
22043                             Register(ra));
22044                      break;
22045                    }
22046                    default:
22047                      UnallocatedT32(instr);
22048                      break;
22049                  }
22050                  break;
22051                }
22052                case 0x11100000: {
22053                  // 0xfb100000
22054                  switch (instr & 0x006000f0) {
22055                    case 0x00000000: {
22056                      // 0xfb100000
22057                      switch (instr & 0x0000f000) {
22058                        case 0x0000f000: {
22059                          // 0xfb10f000
22060                          unsigned rd = (instr >> 8) & 0xf;
22061                          unsigned rn = (instr >> 16) & 0xf;
22062                          unsigned rm = instr & 0xf;
22063                          // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22064                          smulbb(CurrentCond(),
22065                                 Register(rd),
22066                                 Register(rn),
22067                                 Register(rm));
22068                          break;
22069                        }
22070                        default: {
22071                          if (((instr & 0xf000) == 0xf000)) {
22072                            UnallocatedT32(instr);
22073                            return;
22074                          }
22075                          unsigned rd = (instr >> 8) & 0xf;
22076                          unsigned rn = (instr >> 16) & 0xf;
22077                          unsigned rm = instr & 0xf;
22078                          unsigned ra = (instr >> 12) & 0xf;
22079                          // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22080                          smlabb(CurrentCond(),
22081                                 Register(rd),
22082                                 Register(rn),
22083                                 Register(rm),
22084                                 Register(ra));
22085                          break;
22086                        }
22087                      }
22088                      break;
22089                    }
22090                    case 0x00000010: {
22091                      // 0xfb100010
22092                      switch (instr & 0x0000f000) {
22093                        case 0x0000f000: {
22094                          // 0xfb10f010
22095                          unsigned rd = (instr >> 8) & 0xf;
22096                          unsigned rn = (instr >> 16) & 0xf;
22097                          unsigned rm = instr & 0xf;
22098                          // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22099                          smulbt(CurrentCond(),
22100                                 Register(rd),
22101                                 Register(rn),
22102                                 Register(rm));
22103                          break;
22104                        }
22105                        default: {
22106                          if (((instr & 0xf000) == 0xf000)) {
22107                            UnallocatedT32(instr);
22108                            return;
22109                          }
22110                          unsigned rd = (instr >> 8) & 0xf;
22111                          unsigned rn = (instr >> 16) & 0xf;
22112                          unsigned rm = instr & 0xf;
22113                          unsigned ra = (instr >> 12) & 0xf;
22114                          // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22115                          smlabt(CurrentCond(),
22116                                 Register(rd),
22117                                 Register(rn),
22118                                 Register(rm),
22119                                 Register(ra));
22120                          break;
22121                        }
22122                      }
22123                      break;
22124                    }
22125                    case 0x00000020: {
22126                      // 0xfb100020
22127                      switch (instr & 0x0000f000) {
22128                        case 0x0000f000: {
22129                          // 0xfb10f020
22130                          unsigned rd = (instr >> 8) & 0xf;
22131                          unsigned rn = (instr >> 16) & 0xf;
22132                          unsigned rm = instr & 0xf;
22133                          // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22134                          smultb(CurrentCond(),
22135                                 Register(rd),
22136                                 Register(rn),
22137                                 Register(rm));
22138                          break;
22139                        }
22140                        default: {
22141                          if (((instr & 0xf000) == 0xf000)) {
22142                            UnallocatedT32(instr);
22143                            return;
22144                          }
22145                          unsigned rd = (instr >> 8) & 0xf;
22146                          unsigned rn = (instr >> 16) & 0xf;
22147                          unsigned rm = instr & 0xf;
22148                          unsigned ra = (instr >> 12) & 0xf;
22149                          // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22150                          smlatb(CurrentCond(),
22151                                 Register(rd),
22152                                 Register(rn),
22153                                 Register(rm),
22154                                 Register(ra));
22155                          break;
22156                        }
22157                      }
22158                      break;
22159                    }
22160                    case 0x00000030: {
22161                      // 0xfb100030
22162                      switch (instr & 0x0000f000) {
22163                        case 0x0000f000: {
22164                          // 0xfb10f030
22165                          unsigned rd = (instr >> 8) & 0xf;
22166                          unsigned rn = (instr >> 16) & 0xf;
22167                          unsigned rm = instr & 0xf;
22168                          // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22169                          smultt(CurrentCond(),
22170                                 Register(rd),
22171                                 Register(rn),
22172                                 Register(rm));
22173                          break;
22174                        }
22175                        default: {
22176                          if (((instr & 0xf000) == 0xf000)) {
22177                            UnallocatedT32(instr);
22178                            return;
22179                          }
22180                          unsigned rd = (instr >> 8) & 0xf;
22181                          unsigned rn = (instr >> 16) & 0xf;
22182                          unsigned rm = instr & 0xf;
22183                          unsigned ra = (instr >> 12) & 0xf;
22184                          // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22185                          smlatt(CurrentCond(),
22186                                 Register(rd),
22187                                 Register(rn),
22188                                 Register(rm),
22189                                 Register(ra));
22190                          break;
22191                        }
22192                      }
22193                      break;
22194                    }
22195                    case 0x00200000: {
22196                      // 0xfb300000
22197                      switch (instr & 0x0000f000) {
22198                        case 0x0000f000: {
22199                          // 0xfb30f000
22200                          unsigned rd = (instr >> 8) & 0xf;
22201                          unsigned rn = (instr >> 16) & 0xf;
22202                          unsigned rm = instr & 0xf;
22203                          // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22204                          smulwb(CurrentCond(),
22205                                 Register(rd),
22206                                 Register(rn),
22207                                 Register(rm));
22208                          break;
22209                        }
22210                        default: {
22211                          if (((instr & 0xf000) == 0xf000)) {
22212                            UnallocatedT32(instr);
22213                            return;
22214                          }
22215                          unsigned rd = (instr >> 8) & 0xf;
22216                          unsigned rn = (instr >> 16) & 0xf;
22217                          unsigned rm = instr & 0xf;
22218                          unsigned ra = (instr >> 12) & 0xf;
22219                          // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22220                          smlawb(CurrentCond(),
22221                                 Register(rd),
22222                                 Register(rn),
22223                                 Register(rm),
22224                                 Register(ra));
22225                          break;
22226                        }
22227                      }
22228                      break;
22229                    }
22230                    case 0x00200010: {
22231                      // 0xfb300010
22232                      switch (instr & 0x0000f000) {
22233                        case 0x0000f000: {
22234                          // 0xfb30f010
22235                          unsigned rd = (instr >> 8) & 0xf;
22236                          unsigned rn = (instr >> 16) & 0xf;
22237                          unsigned rm = instr & 0xf;
22238                          // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22239                          smulwt(CurrentCond(),
22240                                 Register(rd),
22241                                 Register(rn),
22242                                 Register(rm));
22243                          break;
22244                        }
22245                        default: {
22246                          if (((instr & 0xf000) == 0xf000)) {
22247                            UnallocatedT32(instr);
22248                            return;
22249                          }
22250                          unsigned rd = (instr >> 8) & 0xf;
22251                          unsigned rn = (instr >> 16) & 0xf;
22252                          unsigned rm = instr & 0xf;
22253                          unsigned ra = (instr >> 12) & 0xf;
22254                          // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22255                          smlawt(CurrentCond(),
22256                                 Register(rd),
22257                                 Register(rn),
22258                                 Register(rm),
22259                                 Register(ra));
22260                          break;
22261                        }
22262                      }
22263                      break;
22264                    }
22265                    case 0x00400000: {
22266                      // 0xfb500000
22267                      switch (instr & 0x0000f000) {
22268                        case 0x0000f000: {
22269                          // 0xfb50f000
22270                          unsigned rd = (instr >> 8) & 0xf;
22271                          unsigned rn = (instr >> 16) & 0xf;
22272                          unsigned rm = instr & 0xf;
22273                          // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22274                          smmul(CurrentCond(),
22275                                Register(rd),
22276                                Register(rn),
22277                                Register(rm));
22278                          break;
22279                        }
22280                        default: {
22281                          if (((instr & 0xf000) == 0xf000)) {
22282                            UnallocatedT32(instr);
22283                            return;
22284                          }
22285                          unsigned rd = (instr >> 8) & 0xf;
22286                          unsigned rn = (instr >> 16) & 0xf;
22287                          unsigned rm = instr & 0xf;
22288                          unsigned ra = (instr >> 12) & 0xf;
22289                          // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22290                          smmla(CurrentCond(),
22291                                Register(rd),
22292                                Register(rn),
22293                                Register(rm),
22294                                Register(ra));
22295                          break;
22296                        }
22297                      }
22298                      break;
22299                    }
22300                    case 0x00400010: {
22301                      // 0xfb500010
22302                      switch (instr & 0x0000f000) {
22303                        case 0x0000f000: {
22304                          // 0xfb50f010
22305                          unsigned rd = (instr >> 8) & 0xf;
22306                          unsigned rn = (instr >> 16) & 0xf;
22307                          unsigned rm = instr & 0xf;
22308                          // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22309                          smmulr(CurrentCond(),
22310                                 Register(rd),
22311                                 Register(rn),
22312                                 Register(rm));
22313                          break;
22314                        }
22315                        default: {
22316                          if (((instr & 0xf000) == 0xf000)) {
22317                            UnallocatedT32(instr);
22318                            return;
22319                          }
22320                          unsigned rd = (instr >> 8) & 0xf;
22321                          unsigned rn = (instr >> 16) & 0xf;
22322                          unsigned rm = instr & 0xf;
22323                          unsigned ra = (instr >> 12) & 0xf;
22324                          // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22325                          smmlar(CurrentCond(),
22326                                 Register(rd),
22327                                 Register(rn),
22328                                 Register(rm),
22329                                 Register(ra));
22330                          break;
22331                        }
22332                      }
22333                      break;
22334                    }
22335                    case 0x00600000: {
22336                      // 0xfb700000
22337                      switch (instr & 0x0000f000) {
22338                        case 0x0000f000: {
22339                          // 0xfb70f000
22340                          unsigned rd = (instr >> 8) & 0xf;
22341                          unsigned rn = (instr >> 16) & 0xf;
22342                          unsigned rm = instr & 0xf;
22343                          // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22344                          usad8(CurrentCond(),
22345                                Register(rd),
22346                                Register(rn),
22347                                Register(rm));
22348                          break;
22349                        }
22350                        default: {
22351                          if (((instr & 0xf000) == 0xf000)) {
22352                            UnallocatedT32(instr);
22353                            return;
22354                          }
22355                          unsigned rd = (instr >> 8) & 0xf;
22356                          unsigned rn = (instr >> 16) & 0xf;
22357                          unsigned rm = instr & 0xf;
22358                          unsigned ra = (instr >> 12) & 0xf;
22359                          // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22360                          usada8(CurrentCond(),
22361                                 Register(rd),
22362                                 Register(rn),
22363                                 Register(rm),
22364                                 Register(ra));
22365                          break;
22366                        }
22367                      }
22368                      break;
22369                    }
22370                    default:
22371                      UnallocatedT32(instr);
22372                      break;
22373                  }
22374                  break;
22375                }
22376                case 0x11800000: {
22377                  // 0xfb800000
22378                  switch (instr & 0x006000f0) {
22379                    case 0x00000000: {
22380                      // 0xfb800000
22381                      unsigned rdlo = (instr >> 12) & 0xf;
22382                      unsigned rdhi = (instr >> 8) & 0xf;
22383                      unsigned rn = (instr >> 16) & 0xf;
22384                      unsigned rm = instr & 0xf;
22385                      // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22386                      smull(CurrentCond(),
22387                            Register(rdlo),
22388                            Register(rdhi),
22389                            Register(rn),
22390                            Register(rm));
22391                      break;
22392                    }
22393                    case 0x00200000: {
22394                      // 0xfba00000
22395                      unsigned rdlo = (instr >> 12) & 0xf;
22396                      unsigned rdhi = (instr >> 8) & 0xf;
22397                      unsigned rn = (instr >> 16) & 0xf;
22398                      unsigned rm = instr & 0xf;
22399                      // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22400                      umull(CurrentCond(),
22401                            Register(rdlo),
22402                            Register(rdhi),
22403                            Register(rn),
22404                            Register(rm));
22405                      break;
22406                    }
22407                    case 0x00400000: {
22408                      // 0xfbc00000
22409                      unsigned rdlo = (instr >> 12) & 0xf;
22410                      unsigned rdhi = (instr >> 8) & 0xf;
22411                      unsigned rn = (instr >> 16) & 0xf;
22412                      unsigned rm = instr & 0xf;
22413                      // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22414                      smlal(CurrentCond(),
22415                            Register(rdlo),
22416                            Register(rdhi),
22417                            Register(rn),
22418                            Register(rm));
22419                      break;
22420                    }
22421                    case 0x00400080: {
22422                      // 0xfbc00080
22423                      unsigned rdlo = (instr >> 12) & 0xf;
22424                      unsigned rdhi = (instr >> 8) & 0xf;
22425                      unsigned rn = (instr >> 16) & 0xf;
22426                      unsigned rm = instr & 0xf;
22427                      // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22428                      smlalbb(CurrentCond(),
22429                              Register(rdlo),
22430                              Register(rdhi),
22431                              Register(rn),
22432                              Register(rm));
22433                      break;
22434                    }
22435                    case 0x00400090: {
22436                      // 0xfbc00090
22437                      unsigned rdlo = (instr >> 12) & 0xf;
22438                      unsigned rdhi = (instr >> 8) & 0xf;
22439                      unsigned rn = (instr >> 16) & 0xf;
22440                      unsigned rm = instr & 0xf;
22441                      // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22442                      smlalbt(CurrentCond(),
22443                              Register(rdlo),
22444                              Register(rdhi),
22445                              Register(rn),
22446                              Register(rm));
22447                      break;
22448                    }
22449                    case 0x004000a0: {
22450                      // 0xfbc000a0
22451                      unsigned rdlo = (instr >> 12) & 0xf;
22452                      unsigned rdhi = (instr >> 8) & 0xf;
22453                      unsigned rn = (instr >> 16) & 0xf;
22454                      unsigned rm = instr & 0xf;
22455                      // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22456                      smlaltb(CurrentCond(),
22457                              Register(rdlo),
22458                              Register(rdhi),
22459                              Register(rn),
22460                              Register(rm));
22461                      break;
22462                    }
22463                    case 0x004000b0: {
22464                      // 0xfbc000b0
22465                      unsigned rdlo = (instr >> 12) & 0xf;
22466                      unsigned rdhi = (instr >> 8) & 0xf;
22467                      unsigned rn = (instr >> 16) & 0xf;
22468                      unsigned rm = instr & 0xf;
22469                      // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22470                      smlaltt(CurrentCond(),
22471                              Register(rdlo),
22472                              Register(rdhi),
22473                              Register(rn),
22474                              Register(rm));
22475                      break;
22476                    }
22477                    case 0x004000c0: {
22478                      // 0xfbc000c0
22479                      unsigned rdlo = (instr >> 12) & 0xf;
22480                      unsigned rdhi = (instr >> 8) & 0xf;
22481                      unsigned rn = (instr >> 16) & 0xf;
22482                      unsigned rm = instr & 0xf;
22483                      // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22484                      smlald(CurrentCond(),
22485                             Register(rdlo),
22486                             Register(rdhi),
22487                             Register(rn),
22488                             Register(rm));
22489                      break;
22490                    }
22491                    case 0x004000d0: {
22492                      // 0xfbc000d0
22493                      unsigned rdlo = (instr >> 12) & 0xf;
22494                      unsigned rdhi = (instr >> 8) & 0xf;
22495                      unsigned rn = (instr >> 16) & 0xf;
22496                      unsigned rm = instr & 0xf;
22497                      // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22498                      smlaldx(CurrentCond(),
22499                              Register(rdlo),
22500                              Register(rdhi),
22501                              Register(rn),
22502                              Register(rm));
22503                      break;
22504                    }
22505                    case 0x00600000: {
22506                      // 0xfbe00000
22507                      unsigned rdlo = (instr >> 12) & 0xf;
22508                      unsigned rdhi = (instr >> 8) & 0xf;
22509                      unsigned rn = (instr >> 16) & 0xf;
22510                      unsigned rm = instr & 0xf;
22511                      // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22512                      umlal(CurrentCond(),
22513                            Register(rdlo),
22514                            Register(rdhi),
22515                            Register(rn),
22516                            Register(rm));
22517                      break;
22518                    }
22519                    case 0x00600060: {
22520                      // 0xfbe00060
22521                      unsigned rdlo = (instr >> 12) & 0xf;
22522                      unsigned rdhi = (instr >> 8) & 0xf;
22523                      unsigned rn = (instr >> 16) & 0xf;
22524                      unsigned rm = instr & 0xf;
22525                      // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22526                      umaal(CurrentCond(),
22527                            Register(rdlo),
22528                            Register(rdhi),
22529                            Register(rn),
22530                            Register(rm));
22531                      break;
22532                    }
22533                    default:
22534                      UnallocatedT32(instr);
22535                      break;
22536                  }
22537                  break;
22538                }
22539                case 0x11900000: {
22540                  // 0xfb900000
22541                  switch (instr & 0x006000f0) {
22542                    case 0x000000f0: {
22543                      // 0xfb9000f0
22544                      unsigned rd = (instr >> 8) & 0xf;
22545                      unsigned rn = (instr >> 16) & 0xf;
22546                      unsigned rm = instr & 0xf;
22547                      // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22548                      sdiv(CurrentCond(),
22549                           Register(rd),
22550                           Register(rn),
22551                           Register(rm));
22552                      if (((instr & 0xfff0f0f0) != 0xfb90f0f0)) {
22553                        UnpredictableT32(instr);
22554                      }
22555                      break;
22556                    }
22557                    case 0x002000f0: {
22558                      // 0xfbb000f0
22559                      unsigned rd = (instr >> 8) & 0xf;
22560                      unsigned rn = (instr >> 16) & 0xf;
22561                      unsigned rm = instr & 0xf;
22562                      // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22563                      udiv(CurrentCond(),
22564                           Register(rd),
22565                           Register(rn),
22566                           Register(rm));
22567                      if (((instr & 0xfff0f0f0) != 0xfbb0f0f0)) {
22568                        UnpredictableT32(instr);
22569                      }
22570                      break;
22571                    }
22572                    case 0x004000c0: {
22573                      // 0xfbd000c0
22574                      unsigned rdlo = (instr >> 12) & 0xf;
22575                      unsigned rdhi = (instr >> 8) & 0xf;
22576                      unsigned rn = (instr >> 16) & 0xf;
22577                      unsigned rm = instr & 0xf;
22578                      // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22579                      smlsld(CurrentCond(),
22580                             Register(rdlo),
22581                             Register(rdhi),
22582                             Register(rn),
22583                             Register(rm));
22584                      break;
22585                    }
22586                    case 0x004000d0: {
22587                      // 0xfbd000d0
22588                      unsigned rdlo = (instr >> 12) & 0xf;
22589                      unsigned rdhi = (instr >> 8) & 0xf;
22590                      unsigned rn = (instr >> 16) & 0xf;
22591                      unsigned rm = instr & 0xf;
22592                      // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22593                      smlsldx(CurrentCond(),
22594                              Register(rdlo),
22595                              Register(rdhi),
22596                              Register(rn),
22597                              Register(rm));
22598                      break;
22599                    }
22600                    default:
22601                      UnallocatedT32(instr);
22602                      break;
22603                  }
22604                  break;
22605                }
22606              }
22607              break;
22608            }
22609            case 0x04000000: {
22610              // 0xec000000
22611              switch (instr & 0x11100e00) {
22612                case 0x00000a00: {
22613                  // 0xec000a00
22614                  switch (instr & 0x00800100) {
22615                    case 0x00000000: {
22616                      // 0xec000a00
22617                      if ((instr & 0x006000d0) == 0x00400010) {
22618                        unsigned rm = ExtractSRegister(instr, 5, 0);
22619                        unsigned rt = (instr >> 12) & 0xf;
22620                        unsigned rt2 = (instr >> 16) & 0xf;
22621                        // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; T1
22622                        vmov(CurrentCond(),
22623                             SRegister(rm),
22624                             SRegister(rm + 1),
22625                             Register(rt),
22626                             Register(rt2));
22627                      } else {
22628                        UnallocatedT32(instr);
22629                      }
22630                      break;
22631                    }
22632                    case 0x00000100: {
22633                      // 0xec000b00
22634                      if ((instr & 0x006000d0) == 0x00400010) {
22635                        unsigned rm = ExtractDRegister(instr, 5, 0);
22636                        unsigned rt = (instr >> 12) & 0xf;
22637                        unsigned rt2 = (instr >> 16) & 0xf;
22638                        // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; T1
22639                        vmov(CurrentCond(),
22640                             DRegister(rm),
22641                             Register(rt),
22642                             Register(rt2));
22643                      } else {
22644                        UnallocatedT32(instr);
22645                      }
22646                      break;
22647                    }
22648                    case 0x00800000: {
22649                      // 0xec800a00
22650                      unsigned rn = (instr >> 16) & 0xf;
22651                      WriteBack write_back((instr >> 21) & 0x1);
22652                      unsigned first = ExtractSRegister(instr, 22, 12);
22653                      unsigned len = instr & 0xff;
22654                      // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
22655                      vstm(CurrentCond(),
22656                           kDataTypeValueNone,
22657                           Register(rn),
22658                           write_back,
22659                           SRegisterList(SRegister(first), len));
22660                      if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
22661                        UnpredictableT32(instr);
22662                      }
22663                      break;
22664                    }
22665                    case 0x00800100: {
22666                      // 0xec800b00
22667                      switch (instr & 0x00000001) {
22668                        case 0x00000000: {
22669                          // 0xec800b00
22670                          unsigned rn = (instr >> 16) & 0xf;
22671                          WriteBack write_back((instr >> 21) & 0x1);
22672                          unsigned first = ExtractDRegister(instr, 22, 12);
22673                          unsigned imm8 = (instr & 0xff);
22674                          unsigned len = imm8 / 2;
22675                          unsigned end = first + len;
22676                          // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1
22677                          vstm(CurrentCond(),
22678                               kDataTypeValueNone,
22679                               Register(rn),
22680                               write_back,
22681                               DRegisterList(DRegister(first), len));
22682                          if ((len == 0) || (len > 16) ||
22683                              (end > kMaxNumberOfDRegisters)) {
22684                            UnpredictableT32(instr);
22685                          }
22686                          break;
22687                        }
22688                        case 0x00000001: {
22689                          // 0xec800b01
22690                          unsigned rn = (instr >> 16) & 0xf;
22691                          WriteBack write_back((instr >> 21) & 0x1);
22692                          unsigned first = ExtractDRegister(instr, 22, 12);
22693                          unsigned imm8 = (instr & 0xff);
22694                          unsigned len = imm8 / 2;
22695                          unsigned end = first + len;
22696                          // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
22697                          fstmiax(CurrentCond(),
22698                                  Register(rn),
22699                                  write_back,
22700                                  DRegisterList(DRegister(first), len));
22701                          if ((len == 0) || (len > 16) || (end > 16)) {
22702                            UnpredictableT32(instr);
22703                          }
22704                          break;
22705                        }
22706                      }
22707                      break;
22708                    }
22709                  }
22710                  break;
22711                }
22712                case 0x00000e00: {
22713                  // 0xec000e00
22714                  switch (instr & 0x00600000) {
22715                    case 0x00000000: {
22716                      // 0xec000e00
22717                      if ((instr & 0x0080f100) == 0x00805000) {
22718                        UnimplementedT32_32("STC", instr);
22719                      } else {
22720                        UnallocatedT32(instr);
22721                      }
22722                      break;
22723                    }
22724                    case 0x00200000: {
22725                      // 0xec200e00
22726                      if ((instr & 0x0000f100) == 0x00005000) {
22727                        UnimplementedT32_32("STC", instr);
22728                      } else {
22729                        UnallocatedT32(instr);
22730                      }
22731                      break;
22732                    }
22733                    case 0x00400000: {
22734                      // 0xec400e00
22735                      if ((instr & 0x00800000) == 0x00000000) {
22736                        UnimplementedT32_32("MCRR", instr);
22737                      } else {
22738                        UnallocatedT32(instr);
22739                      }
22740                      break;
22741                    }
22742                    default:
22743                      UnallocatedT32(instr);
22744                      break;
22745                  }
22746                  break;
22747                }
22748                case 0x00100a00: {
22749                  // 0xec100a00
22750                  switch (instr & 0x00800100) {
22751                    case 0x00000000: {
22752                      // 0xec100a00
22753                      if ((instr & 0x006000d0) == 0x00400010) {
22754                        unsigned rt = (instr >> 12) & 0xf;
22755                        unsigned rt2 = (instr >> 16) & 0xf;
22756                        unsigned rm = ExtractSRegister(instr, 5, 0);
22757                        // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; T1
22758                        vmov(CurrentCond(),
22759                             Register(rt),
22760                             Register(rt2),
22761                             SRegister(rm),
22762                             SRegister(rm + 1));
22763                      } else {
22764                        UnallocatedT32(instr);
22765                      }
22766                      break;
22767                    }
22768                    case 0x00000100: {
22769                      // 0xec100b00
22770                      if ((instr & 0x006000d0) == 0x00400010) {
22771                        unsigned rt = (instr >> 12) & 0xf;
22772                        unsigned rt2 = (instr >> 16) & 0xf;
22773                        unsigned rm = ExtractDRegister(instr, 5, 0);
22774                        // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; T1
22775                        vmov(CurrentCond(),
22776                             Register(rt),
22777                             Register(rt2),
22778                             DRegister(rm));
22779                      } else {
22780                        UnallocatedT32(instr);
22781                      }
22782                      break;
22783                    }
22784                    case 0x00800000: {
22785                      // 0xec900a00
22786                      if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
22787                           Uint32(0x1)) &&
22788                          ((Uint32((instr >> 16)) & Uint32(0xf)) ==
22789                           Uint32(0xd))) {
22790                        unsigned first = ExtractSRegister(instr, 22, 12);
22791                        unsigned len = instr & 0xff;
22792                        // VPOP{<c>}{<q>}{.<size>} <sreglist> ; T2
22793                        vpop(CurrentCond(),
22794                             kDataTypeValueNone,
22795                             SRegisterList(SRegister(first), len));
22796                        if ((len == 0) ||
22797                            ((first + len) > kNumberOfSRegisters)) {
22798                          UnpredictableT32(instr);
22799                        }
22800                        return;
22801                      }
22802                      unsigned rn = (instr >> 16) & 0xf;
22803                      WriteBack write_back((instr >> 21) & 0x1);
22804                      unsigned first = ExtractSRegister(instr, 22, 12);
22805                      unsigned len = instr & 0xff;
22806                      // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
22807                      vldm(CurrentCond(),
22808                           kDataTypeValueNone,
22809                           Register(rn),
22810                           write_back,
22811                           SRegisterList(SRegister(first), len));
22812                      if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
22813                        UnpredictableT32(instr);
22814                      }
22815                      break;
22816                    }
22817                    case 0x00800100: {
22818                      // 0xec900b00
22819                      switch (instr & 0x00000001) {
22820                        case 0x00000000: {
22821                          // 0xec900b00
22822                          if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
22823                               Uint32(0x1)) &&
22824                              ((Uint32((instr >> 16)) & Uint32(0xf)) ==
22825                               Uint32(0xd))) {
22826                            unsigned first = ExtractDRegister(instr, 22, 12);
22827                            unsigned imm8 = (instr & 0xff);
22828                            unsigned len = imm8 / 2;
22829                            unsigned end = first + len;
22830                            // VPOP{<c>}{<q>}{.<size>} <dreglist> ; T1
22831                            vpop(CurrentCond(),
22832                                 kDataTypeValueNone,
22833                                 DRegisterList(DRegister(first), len));
22834                            if ((len == 0) || (len > 16) ||
22835                                (end > kMaxNumberOfDRegisters)) {
22836                              UnpredictableT32(instr);
22837                            }
22838                            return;
22839                          }
22840                          unsigned rn = (instr >> 16) & 0xf;
22841                          WriteBack write_back((instr >> 21) & 0x1);
22842                          unsigned first = ExtractDRegister(instr, 22, 12);
22843                          unsigned imm8 = (instr & 0xff);
22844                          unsigned len = imm8 / 2;
22845                          unsigned end = first + len;
22846                          // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1
22847                          vldm(CurrentCond(),
22848                               kDataTypeValueNone,
22849                               Register(rn),
22850                               write_back,
22851                               DRegisterList(DRegister(first), len));
22852                          if ((len == 0) || (len > 16) ||
22853                              (end > kMaxNumberOfDRegisters)) {
22854                            UnpredictableT32(instr);
22855                          }
22856                          break;
22857                        }
22858                        case 0x00000001: {
22859                          // 0xec900b01
22860                          unsigned rn = (instr >> 16) & 0xf;
22861                          WriteBack write_back((instr >> 21) & 0x1);
22862                          unsigned first = ExtractDRegister(instr, 22, 12);
22863                          unsigned imm8 = (instr & 0xff);
22864                          unsigned len = imm8 / 2;
22865                          unsigned end = first + len;
22866                          // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
22867                          fldmiax(CurrentCond(),
22868                                  Register(rn),
22869                                  write_back,
22870                                  DRegisterList(DRegister(first), len));
22871                          if ((len == 0) || (len > 16) || (end > 16)) {
22872                            UnpredictableT32(instr);
22873                          }
22874                          break;
22875                        }
22876                      }
22877                      break;
22878                    }
22879                  }
22880                  break;
22881                }
22882                case 0x00100e00: {
22883                  // 0xec100e00
22884                  switch (instr & 0x00600000) {
22885                    case 0x00000000: {
22886                      // 0xec100e00
22887                      if ((instr & 0x0080f100) == 0x00805000) {
22888                        if (((instr & 0xf0000) == 0xf0000)) {
22889                          UnallocatedT32(instr);
22890                          return;
22891                        }
22892                        UnimplementedT32_32("LDC", instr);
22893                      } else {
22894                        UnallocatedT32(instr);
22895                      }
22896                      break;
22897                    }
22898                    case 0x00200000: {
22899                      // 0xec300e00
22900                      if ((instr & 0x0000f100) == 0x00005000) {
22901                        if (((instr & 0xf0000) == 0xf0000)) {
22902                          UnallocatedT32(instr);
22903                          return;
22904                        }
22905                        UnimplementedT32_32("LDC", instr);
22906                      } else {
22907                        UnallocatedT32(instr);
22908                      }
22909                      break;
22910                    }
22911                    case 0x00400000: {
22912                      // 0xec500e00
22913                      if ((instr & 0x00800000) == 0x00000000) {
22914                        UnimplementedT32_32("MRRC", instr);
22915                      } else {
22916                        UnallocatedT32(instr);
22917                      }
22918                      break;
22919                    }
22920                    default:
22921                      UnallocatedT32(instr);
22922                      break;
22923                  }
22924                  break;
22925                }
22926                case 0x01000a00: {
22927                  // 0xed000a00
22928                  switch (instr & 0x00200100) {
22929                    case 0x00000000: {
22930                      // 0xed000a00
22931                      unsigned rd = ExtractSRegister(instr, 22, 12);
22932                      unsigned rn = (instr >> 16) & 0xf;
22933                      Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
22934                      int32_t offset = (instr & 0xff) << 2;
22935                      // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2
22936                      vstr(CurrentCond(),
22937                           Untyped32,
22938                           SRegister(rd),
22939                           MemOperand(Register(rn), sign, offset, Offset));
22940                      break;
22941                    }
22942                    case 0x00000100: {
22943                      // 0xed000b00
22944                      unsigned rd = ExtractDRegister(instr, 22, 12);
22945                      unsigned rn = (instr >> 16) & 0xf;
22946                      Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
22947                      int32_t offset = (instr & 0xff) << 2;
22948                      // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1
22949                      vstr(CurrentCond(),
22950                           Untyped64,
22951                           DRegister(rd),
22952                           MemOperand(Register(rn), sign, offset, Offset));
22953                      break;
22954                    }
22955                    case 0x00200000: {
22956                      // 0xed200a00
22957                      if ((instr & 0x00800000) == 0x00000000) {
22958                        if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
22959                             Uint32(0xd))) {
22960                          unsigned first = ExtractSRegister(instr, 22, 12);
22961                          unsigned len = instr & 0xff;
22962                          // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; T2
22963                          vpush(CurrentCond(),
22964                                kDataTypeValueNone,
22965                                SRegisterList(SRegister(first), len));
22966                          if ((len == 0) ||
22967                              ((first + len) > kNumberOfSRegisters)) {
22968                            UnpredictableT32(instr);
22969                          }
22970                          return;
22971                        }
22972                        unsigned rn = (instr >> 16) & 0xf;
22973                        unsigned first = ExtractSRegister(instr, 22, 12);
22974                        unsigned len = instr & 0xff;
22975                        // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2
22976                        vstmdb(CurrentCond(),
22977                               kDataTypeValueNone,
22978                               Register(rn),
22979                               WriteBack(WRITE_BACK),
22980                               SRegisterList(SRegister(first), len));
22981                        if ((len == 0) ||
22982                            ((first + len) > kNumberOfSRegisters)) {
22983                          UnpredictableT32(instr);
22984                        }
22985                      } else {
22986                        UnallocatedT32(instr);
22987                      }
22988                      break;
22989                    }
22990                    case 0x00200100: {
22991                      // 0xed200b00
22992                      switch (instr & 0x00800001) {
22993                        case 0x00000000: {
22994                          // 0xed200b00
22995                          if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
22996                               Uint32(0xd))) {
22997                            unsigned first = ExtractDRegister(instr, 22, 12);
22998                            unsigned imm8 = (instr & 0xff);
22999                            unsigned len = imm8 / 2;
23000                            unsigned end = first + len;
23001                            // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; T1
23002                            vpush(CurrentCond(),
23003                                  kDataTypeValueNone,
23004                                  DRegisterList(DRegister(first), len));
23005                            if ((len == 0) || (len > 16) ||
23006                                (end > kMaxNumberOfDRegisters)) {
23007                              UnpredictableT32(instr);
23008                            }
23009                            return;
23010                          }
23011                          unsigned rn = (instr >> 16) & 0xf;
23012                          unsigned first = ExtractDRegister(instr, 22, 12);
23013                          unsigned imm8 = (instr & 0xff);
23014                          unsigned len = imm8 / 2;
23015                          unsigned end = first + len;
23016                          // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1
23017                          vstmdb(CurrentCond(),
23018                                 kDataTypeValueNone,
23019                                 Register(rn),
23020                                 WriteBack(WRITE_BACK),
23021                                 DRegisterList(DRegister(first), len));
23022                          if ((len == 0) || (len > 16) ||
23023                              (end > kMaxNumberOfDRegisters)) {
23024                            UnpredictableT32(instr);
23025                          }
23026                          break;
23027                        }
23028                        case 0x00000001: {
23029                          // 0xed200b01
23030                          unsigned rn = (instr >> 16) & 0xf;
23031                          unsigned first = ExtractDRegister(instr, 22, 12);
23032                          unsigned imm8 = (instr & 0xff);
23033                          unsigned len = imm8 / 2;
23034                          unsigned end = first + len;
23035                          // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
23036                          fstmdbx(CurrentCond(),
23037                                  Register(rn),
23038                                  WriteBack(WRITE_BACK),
23039                                  DRegisterList(DRegister(first), len));
23040                          if ((len == 0) || (len > 16) || (end > 16)) {
23041                            UnpredictableT32(instr);
23042                          }
23043                          break;
23044                        }
23045                        default:
23046                          UnallocatedT32(instr);
23047                          break;
23048                      }
23049                      break;
23050                    }
23051                  }
23052                  break;
23053                }
23054                case 0x01000e00: {
23055                  // 0xed000e00
23056                  switch (instr & 0x0060f100) {
23057                    case 0x00005000: {
23058                      // 0xed005e00
23059                      UnimplementedT32_32("STC", instr);
23060                      break;
23061                    }
23062                    case 0x00205000: {
23063                      // 0xed205e00
23064                      UnimplementedT32_32("STC", instr);
23065                      break;
23066                    }
23067                    default:
23068                      UnallocatedT32(instr);
23069                      break;
23070                  }
23071                  break;
23072                }
23073                case 0x01100a00: {
23074                  // 0xed100a00
23075                  switch (instr & 0x00200100) {
23076                    case 0x00000000: {
23077                      // 0xed100a00
23078                      switch (instr & 0x000f0000) {
23079                        case 0x000f0000: {
23080                          // 0xed1f0a00
23081                          unsigned rd = ExtractSRegister(instr, 22, 12);
23082                          uint32_t U = (instr >> 23) & 0x1;
23083                          int32_t imm = instr & 0xff;
23084                          imm <<= 2;
23085                          if (U == 0) imm = -imm;
23086                          bool minus_zero = (imm == 0) && (U == 0);
23087                          Location location(imm, kT32PcDelta);
23088                          // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; T2
23089                          if (minus_zero) {
23090                            vldr(CurrentCond(),
23091                                 Untyped32,
23092                                 SRegister(rd),
23093                                 MemOperand(pc, minus, 0));
23094                          } else {
23095                            vldr(CurrentCond(),
23096                                 Untyped32,
23097                                 SRegister(rd),
23098                                 &location);
23099                          }
23100                          break;
23101                        }
23102                        default: {
23103                          if (((instr & 0xf0000) == 0xf0000)) {
23104                            UnallocatedT32(instr);
23105                            return;
23106                          }
23107                          unsigned rd = ExtractSRegister(instr, 22, 12);
23108                          unsigned rn = (instr >> 16) & 0xf;
23109                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
23110                                                                 : plus);
23111                          int32_t offset = (instr & 0xff) << 2;
23112                          // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
23113                          vldr(CurrentCond(),
23114                               Untyped32,
23115                               SRegister(rd),
23116                               MemOperand(Register(rn), sign, offset, Offset));
23117                          break;
23118                        }
23119                      }
23120                      break;
23121                    }
23122                    case 0x00000100: {
23123                      // 0xed100b00
23124                      switch (instr & 0x000f0000) {
23125                        case 0x000f0000: {
23126                          // 0xed1f0b00
23127                          unsigned rd = ExtractDRegister(instr, 22, 12);
23128                          uint32_t U = (instr >> 23) & 0x1;
23129                          int32_t imm = instr & 0xff;
23130                          imm <<= 2;
23131                          if (U == 0) imm = -imm;
23132                          bool minus_zero = (imm == 0) && (U == 0);
23133                          Location location(imm, kT32PcDelta);
23134                          // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; T1
23135                          if (minus_zero) {
23136                            vldr(CurrentCond(),
23137                                 Untyped64,
23138                                 DRegister(rd),
23139                                 MemOperand(pc, minus, 0));
23140                          } else {
23141                            vldr(CurrentCond(),
23142                                 Untyped64,
23143                                 DRegister(rd),
23144                                 &location);
23145                          }
23146                          break;
23147                        }
23148                        default: {
23149                          if (((instr & 0xf0000) == 0xf0000)) {
23150                            UnallocatedT32(instr);
23151                            return;
23152                          }
23153                          unsigned rd = ExtractDRegister(instr, 22, 12);
23154                          unsigned rn = (instr >> 16) & 0xf;
23155                          Sign sign((((instr >> 23) & 0x1) == 0) ? minus
23156                                                                 : plus);
23157                          int32_t offset = (instr & 0xff) << 2;
23158                          // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
23159                          vldr(CurrentCond(),
23160                               Untyped64,
23161                               DRegister(rd),
23162                               MemOperand(Register(rn), sign, offset, Offset));
23163                          break;
23164                        }
23165                      }
23166                      break;
23167                    }
23168                    case 0x00200000: {
23169                      // 0xed300a00
23170                      if ((instr & 0x00800000) == 0x00000000) {
23171                        unsigned rn = (instr >> 16) & 0xf;
23172                        unsigned first = ExtractSRegister(instr, 22, 12);
23173                        unsigned len = instr & 0xff;
23174                        // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2
23175                        vldmdb(CurrentCond(),
23176                               kDataTypeValueNone,
23177                               Register(rn),
23178                               WriteBack(WRITE_BACK),
23179                               SRegisterList(SRegister(first), len));
23180                        if ((len == 0) ||
23181                            ((first + len) > kNumberOfSRegisters)) {
23182                          UnpredictableT32(instr);
23183                        }
23184                      } else {
23185                        UnallocatedT32(instr);
23186                      }
23187                      break;
23188                    }
23189                    case 0x00200100: {
23190                      // 0xed300b00
23191                      switch (instr & 0x00800001) {
23192                        case 0x00000000: {
23193                          // 0xed300b00
23194                          unsigned rn = (instr >> 16) & 0xf;
23195                          unsigned first = ExtractDRegister(instr, 22, 12);
23196                          unsigned imm8 = (instr & 0xff);
23197                          unsigned len = imm8 / 2;
23198                          unsigned end = first + len;
23199                          // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1
23200                          vldmdb(CurrentCond(),
23201                                 kDataTypeValueNone,
23202                                 Register(rn),
23203                                 WriteBack(WRITE_BACK),
23204                                 DRegisterList(DRegister(first), len));
23205                          if ((len == 0) || (len > 16) ||
23206                              (end > kMaxNumberOfDRegisters)) {
23207                            UnpredictableT32(instr);
23208                          }
23209                          break;
23210                        }
23211                        case 0x00000001: {
23212                          // 0xed300b01
23213                          unsigned rn = (instr >> 16) & 0xf;
23214                          unsigned first = ExtractDRegister(instr, 22, 12);
23215                          unsigned imm8 = (instr & 0xff);
23216                          unsigned len = imm8 / 2;
23217                          unsigned end = first + len;
23218                          // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
23219                          fldmdbx(CurrentCond(),
23220                                  Register(rn),
23221                                  WriteBack(WRITE_BACK),
23222                                  DRegisterList(DRegister(first), len));
23223                          if ((len == 0) || (len > 16) || (end > 16)) {
23224                            UnpredictableT32(instr);
23225                          }
23226                          break;
23227                        }
23228                        default:
23229                          UnallocatedT32(instr);
23230                          break;
23231                      }
23232                      break;
23233                    }
23234                  }
23235                  break;
23236                }
23237                case 0x01100e00: {
23238                  // 0xed100e00
23239                  switch (instr & 0x0060f100) {
23240                    case 0x00005000: {
23241                      // 0xed105e00
23242                      switch (instr & 0x000f0000) {
23243                        case 0x000f0000: {
23244                          // 0xed1f5e00
23245                          UnimplementedT32_32("LDC", instr);
23246                          break;
23247                        }
23248                        default: {
23249                          if (((instr & 0xf0000) == 0xf0000)) {
23250                            UnallocatedT32(instr);
23251                            return;
23252                          }
23253                          UnimplementedT32_32("LDC", instr);
23254                          break;
23255                        }
23256                      }
23257                      break;
23258                    }
23259                    case 0x00205000: {
23260                      // 0xed305e00
23261                      if (((instr & 0xf0000) == 0xf0000)) {
23262                        UnallocatedT32(instr);
23263                        return;
23264                      }
23265                      UnimplementedT32_32("LDC", instr);
23266                      break;
23267                    }
23268                    default:
23269                      UnallocatedT32(instr);
23270                      break;
23271                  }
23272                  break;
23273                }
23274                default:
23275                  UnallocatedT32(instr);
23276                  break;
23277              }
23278              break;
23279            }
23280            case 0x06000000: {
23281              // 0xee000000
23282              switch (instr & 0x01000010) {
23283                case 0x00000000: {
23284                  // 0xee000000
23285                  switch (instr & 0x10b00f40) {
23286                    case 0x00000a00: {
23287                      // 0xee000a00
23288                      unsigned rd = ExtractSRegister(instr, 22, 12);
23289                      unsigned rn = ExtractSRegister(instr, 7, 16);
23290                      unsigned rm = ExtractSRegister(instr, 5, 0);
23291                      // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23292                      vmla(CurrentCond(),
23293                           F32,
23294                           SRegister(rd),
23295                           SRegister(rn),
23296                           SRegister(rm));
23297                      break;
23298                    }
23299                    case 0x00000a40: {
23300                      // 0xee000a40
23301                      unsigned rd = ExtractSRegister(instr, 22, 12);
23302                      unsigned rn = ExtractSRegister(instr, 7, 16);
23303                      unsigned rm = ExtractSRegister(instr, 5, 0);
23304                      // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23305                      vmls(CurrentCond(),
23306                           F32,
23307                           SRegister(rd),
23308                           SRegister(rn),
23309                           SRegister(rm));
23310                      break;
23311                    }
23312                    case 0x00000b00: {
23313                      // 0xee000b00
23314                      unsigned rd = ExtractDRegister(instr, 22, 12);
23315                      unsigned rn = ExtractDRegister(instr, 7, 16);
23316                      unsigned rm = ExtractDRegister(instr, 5, 0);
23317                      // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23318                      vmla(CurrentCond(),
23319                           F64,
23320                           DRegister(rd),
23321                           DRegister(rn),
23322                           DRegister(rm));
23323                      break;
23324                    }
23325                    case 0x00000b40: {
23326                      // 0xee000b40
23327                      unsigned rd = ExtractDRegister(instr, 22, 12);
23328                      unsigned rn = ExtractDRegister(instr, 7, 16);
23329                      unsigned rm = ExtractDRegister(instr, 5, 0);
23330                      // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23331                      vmls(CurrentCond(),
23332                           F64,
23333                           DRegister(rd),
23334                           DRegister(rn),
23335                           DRegister(rm));
23336                      break;
23337                    }
23338                    case 0x00100a00: {
23339                      // 0xee100a00
23340                      unsigned rd = ExtractSRegister(instr, 22, 12);
23341                      unsigned rn = ExtractSRegister(instr, 7, 16);
23342                      unsigned rm = ExtractSRegister(instr, 5, 0);
23343                      // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23344                      vnmls(CurrentCond(),
23345                            F32,
23346                            SRegister(rd),
23347                            SRegister(rn),
23348                            SRegister(rm));
23349                      break;
23350                    }
23351                    case 0x00100a40: {
23352                      // 0xee100a40
23353                      unsigned rd = ExtractSRegister(instr, 22, 12);
23354                      unsigned rn = ExtractSRegister(instr, 7, 16);
23355                      unsigned rm = ExtractSRegister(instr, 5, 0);
23356                      // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23357                      vnmla(CurrentCond(),
23358                            F32,
23359                            SRegister(rd),
23360                            SRegister(rn),
23361                            SRegister(rm));
23362                      break;
23363                    }
23364                    case 0x00100b00: {
23365                      // 0xee100b00
23366                      unsigned rd = ExtractDRegister(instr, 22, 12);
23367                      unsigned rn = ExtractDRegister(instr, 7, 16);
23368                      unsigned rm = ExtractDRegister(instr, 5, 0);
23369                      // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23370                      vnmls(CurrentCond(),
23371                            F64,
23372                            DRegister(rd),
23373                            DRegister(rn),
23374                            DRegister(rm));
23375                      break;
23376                    }
23377                    case 0x00100b40: {
23378                      // 0xee100b40
23379                      unsigned rd = ExtractDRegister(instr, 22, 12);
23380                      unsigned rn = ExtractDRegister(instr, 7, 16);
23381                      unsigned rm = ExtractDRegister(instr, 5, 0);
23382                      // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23383                      vnmla(CurrentCond(),
23384                            F64,
23385                            DRegister(rd),
23386                            DRegister(rn),
23387                            DRegister(rm));
23388                      break;
23389                    }
23390                    case 0x00200a00: {
23391                      // 0xee200a00
23392                      unsigned rd = ExtractSRegister(instr, 22, 12);
23393                      unsigned rn = ExtractSRegister(instr, 7, 16);
23394                      unsigned rm = ExtractSRegister(instr, 5, 0);
23395                      // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23396                      vmul(CurrentCond(),
23397                           F32,
23398                           SRegister(rd),
23399                           SRegister(rn),
23400                           SRegister(rm));
23401                      break;
23402                    }
23403                    case 0x00200a40: {
23404                      // 0xee200a40
23405                      unsigned rd = ExtractSRegister(instr, 22, 12);
23406                      unsigned rn = ExtractSRegister(instr, 7, 16);
23407                      unsigned rm = ExtractSRegister(instr, 5, 0);
23408                      // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
23409                      vnmul(CurrentCond(),
23410                            F32,
23411                            SRegister(rd),
23412                            SRegister(rn),
23413                            SRegister(rm));
23414                      break;
23415                    }
23416                    case 0x00200b00: {
23417                      // 0xee200b00
23418                      unsigned rd = ExtractDRegister(instr, 22, 12);
23419                      unsigned rn = ExtractDRegister(instr, 7, 16);
23420                      unsigned rm = ExtractDRegister(instr, 5, 0);
23421                      // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23422                      vmul(CurrentCond(),
23423                           F64,
23424                           DRegister(rd),
23425                           DRegister(rn),
23426                           DRegister(rm));
23427                      break;
23428                    }
23429                    case 0x00200b40: {
23430                      // 0xee200b40
23431                      unsigned rd = ExtractDRegister(instr, 22, 12);
23432                      unsigned rn = ExtractDRegister(instr, 7, 16);
23433                      unsigned rm = ExtractDRegister(instr, 5, 0);
23434                      // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
23435                      vnmul(CurrentCond(),
23436                            F64,
23437                            DRegister(rd),
23438                            DRegister(rn),
23439                            DRegister(rm));
23440                      break;
23441                    }
23442                    case 0x00300a00: {
23443                      // 0xee300a00
23444                      unsigned rd = ExtractSRegister(instr, 22, 12);
23445                      unsigned rn = ExtractSRegister(instr, 7, 16);
23446                      unsigned rm = ExtractSRegister(instr, 5, 0);
23447                      // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23448                      vadd(CurrentCond(),
23449                           F32,
23450                           SRegister(rd),
23451                           SRegister(rn),
23452                           SRegister(rm));
23453                      break;
23454                    }
23455                    case 0x00300a40: {
23456                      // 0xee300a40
23457                      unsigned rd = ExtractSRegister(instr, 22, 12);
23458                      unsigned rn = ExtractSRegister(instr, 7, 16);
23459                      unsigned rm = ExtractSRegister(instr, 5, 0);
23460                      // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23461                      vsub(CurrentCond(),
23462                           F32,
23463                           SRegister(rd),
23464                           SRegister(rn),
23465                           SRegister(rm));
23466                      break;
23467                    }
23468                    case 0x00300b00: {
23469                      // 0xee300b00
23470                      unsigned rd = ExtractDRegister(instr, 22, 12);
23471                      unsigned rn = ExtractDRegister(instr, 7, 16);
23472                      unsigned rm = ExtractDRegister(instr, 5, 0);
23473                      // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23474                      vadd(CurrentCond(),
23475                           F64,
23476                           DRegister(rd),
23477                           DRegister(rn),
23478                           DRegister(rm));
23479                      break;
23480                    }
23481                    case 0x00300b40: {
23482                      // 0xee300b40
23483                      unsigned rd = ExtractDRegister(instr, 22, 12);
23484                      unsigned rn = ExtractDRegister(instr, 7, 16);
23485                      unsigned rm = ExtractDRegister(instr, 5, 0);
23486                      // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23487                      vsub(CurrentCond(),
23488                           F64,
23489                           DRegister(rd),
23490                           DRegister(rn),
23491                           DRegister(rm));
23492                      break;
23493                    }
23494                    case 0x00800a00: {
23495                      // 0xee800a00
23496                      unsigned rd = ExtractSRegister(instr, 22, 12);
23497                      unsigned rn = ExtractSRegister(instr, 7, 16);
23498                      unsigned rm = ExtractSRegister(instr, 5, 0);
23499                      // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
23500                      vdiv(CurrentCond(),
23501                           F32,
23502                           SRegister(rd),
23503                           SRegister(rn),
23504                           SRegister(rm));
23505                      break;
23506                    }
23507                    case 0x00800b00: {
23508                      // 0xee800b00
23509                      unsigned rd = ExtractDRegister(instr, 22, 12);
23510                      unsigned rn = ExtractDRegister(instr, 7, 16);
23511                      unsigned rm = ExtractDRegister(instr, 5, 0);
23512                      // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
23513                      vdiv(CurrentCond(),
23514                           F64,
23515                           DRegister(rd),
23516                           DRegister(rn),
23517                           DRegister(rm));
23518                      break;
23519                    }
23520                    case 0x00900a00: {
23521                      // 0xee900a00
23522                      unsigned rd = ExtractSRegister(instr, 22, 12);
23523                      unsigned rn = ExtractSRegister(instr, 7, 16);
23524                      unsigned rm = ExtractSRegister(instr, 5, 0);
23525                      // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23526                      vfnms(CurrentCond(),
23527                            F32,
23528                            SRegister(rd),
23529                            SRegister(rn),
23530                            SRegister(rm));
23531                      break;
23532                    }
23533                    case 0x00900a40: {
23534                      // 0xee900a40
23535                      unsigned rd = ExtractSRegister(instr, 22, 12);
23536                      unsigned rn = ExtractSRegister(instr, 7, 16);
23537                      unsigned rm = ExtractSRegister(instr, 5, 0);
23538                      // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23539                      vfnma(CurrentCond(),
23540                            F32,
23541                            SRegister(rd),
23542                            SRegister(rn),
23543                            SRegister(rm));
23544                      break;
23545                    }
23546                    case 0x00900b00: {
23547                      // 0xee900b00
23548                      unsigned rd = ExtractDRegister(instr, 22, 12);
23549                      unsigned rn = ExtractDRegister(instr, 7, 16);
23550                      unsigned rm = ExtractDRegister(instr, 5, 0);
23551                      // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23552                      vfnms(CurrentCond(),
23553                            F64,
23554                            DRegister(rd),
23555                            DRegister(rn),
23556                            DRegister(rm));
23557                      break;
23558                    }
23559                    case 0x00900b40: {
23560                      // 0xee900b40
23561                      unsigned rd = ExtractDRegister(instr, 22, 12);
23562                      unsigned rn = ExtractDRegister(instr, 7, 16);
23563                      unsigned rm = ExtractDRegister(instr, 5, 0);
23564                      // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23565                      vfnma(CurrentCond(),
23566                            F64,
23567                            DRegister(rd),
23568                            DRegister(rn),
23569                            DRegister(rm));
23570                      break;
23571                    }
23572                    case 0x00a00a00: {
23573                      // 0xeea00a00
23574                      unsigned rd = ExtractSRegister(instr, 22, 12);
23575                      unsigned rn = ExtractSRegister(instr, 7, 16);
23576                      unsigned rm = ExtractSRegister(instr, 5, 0);
23577                      // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23578                      vfma(CurrentCond(),
23579                           F32,
23580                           SRegister(rd),
23581                           SRegister(rn),
23582                           SRegister(rm));
23583                      break;
23584                    }
23585                    case 0x00a00a40: {
23586                      // 0xeea00a40
23587                      unsigned rd = ExtractSRegister(instr, 22, 12);
23588                      unsigned rn = ExtractSRegister(instr, 7, 16);
23589                      unsigned rm = ExtractSRegister(instr, 5, 0);
23590                      // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23591                      vfms(CurrentCond(),
23592                           F32,
23593                           SRegister(rd),
23594                           SRegister(rn),
23595                           SRegister(rm));
23596                      break;
23597                    }
23598                    case 0x00a00b00: {
23599                      // 0xeea00b00
23600                      unsigned rd = ExtractDRegister(instr, 22, 12);
23601                      unsigned rn = ExtractDRegister(instr, 7, 16);
23602                      unsigned rm = ExtractDRegister(instr, 5, 0);
23603                      // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23604                      vfma(CurrentCond(),
23605                           F64,
23606                           DRegister(rd),
23607                           DRegister(rn),
23608                           DRegister(rm));
23609                      break;
23610                    }
23611                    case 0x00a00b40: {
23612                      // 0xeea00b40
23613                      unsigned rd = ExtractDRegister(instr, 22, 12);
23614                      unsigned rn = ExtractDRegister(instr, 7, 16);
23615                      unsigned rm = ExtractDRegister(instr, 5, 0);
23616                      // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23617                      vfms(CurrentCond(),
23618                           F64,
23619                           DRegister(rd),
23620                           DRegister(rn),
23621                           DRegister(rm));
23622                      break;
23623                    }
23624                    case 0x00b00a00: {
23625                      // 0xeeb00a00
23626                      unsigned rd = ExtractSRegister(instr, 22, 12);
23627                      uint32_t encoded_imm =
23628                          (instr & 0xf) | ((instr >> 12) & 0xf0);
23629                      NeonImmediate imm =
23630                          ImmediateVFP::Decode<float>(encoded_imm);
23631                      // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; T2
23632                      vmov(CurrentCond(), F32, SRegister(rd), imm);
23633                      if (((instr & 0xffb00ff0) != 0xeeb00a00)) {
23634                        UnpredictableT32(instr);
23635                      }
23636                      break;
23637                    }
23638                    case 0x00b00a40: {
23639                      // 0xeeb00a40
23640                      switch (instr & 0x000e0000) {
23641                        case 0x00000000: {
23642                          // 0xeeb00a40
23643                          switch (instr & 0x00010080) {
23644                            case 0x00000000: {
23645                              // 0xeeb00a40
23646                              unsigned rd = ExtractSRegister(instr, 22, 12);
23647                              unsigned rm = ExtractSRegister(instr, 5, 0);
23648                              // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23649                              vmov(CurrentCond(),
23650                                   F32,
23651                                   SRegister(rd),
23652                                   SRegister(rm));
23653                              break;
23654                            }
23655                            case 0x00000080: {
23656                              // 0xeeb00ac0
23657                              unsigned rd = ExtractSRegister(instr, 22, 12);
23658                              unsigned rm = ExtractSRegister(instr, 5, 0);
23659                              // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23660                              vabs(CurrentCond(),
23661                                   F32,
23662                                   SRegister(rd),
23663                                   SRegister(rm));
23664                              break;
23665                            }
23666                            case 0x00010000: {
23667                              // 0xeeb10a40
23668                              unsigned rd = ExtractSRegister(instr, 22, 12);
23669                              unsigned rm = ExtractSRegister(instr, 5, 0);
23670                              // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23671                              vneg(CurrentCond(),
23672                                   F32,
23673                                   SRegister(rd),
23674                                   SRegister(rm));
23675                              break;
23676                            }
23677                            case 0x00010080: {
23678                              // 0xeeb10ac0
23679                              unsigned rd = ExtractSRegister(instr, 22, 12);
23680                              unsigned rm = ExtractSRegister(instr, 5, 0);
23681                              // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23682                              vsqrt(CurrentCond(),
23683                                    F32,
23684                                    SRegister(rd),
23685                                    SRegister(rm));
23686                              break;
23687                            }
23688                          }
23689                          break;
23690                        }
23691                        case 0x00020000: {
23692                          // 0xeeb20a40
23693                          switch (instr & 0x00010080) {
23694                            case 0x00000000: {
23695                              // 0xeeb20a40
23696                              unsigned rd = ExtractSRegister(instr, 22, 12);
23697                              unsigned rm = ExtractSRegister(instr, 5, 0);
23698                              // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
23699                              vcvtb(CurrentCond(),
23700                                    F32,
23701                                    F16,
23702                                    SRegister(rd),
23703                                    SRegister(rm));
23704                              break;
23705                            }
23706                            case 0x00000080: {
23707                              // 0xeeb20ac0
23708                              unsigned rd = ExtractSRegister(instr, 22, 12);
23709                              unsigned rm = ExtractSRegister(instr, 5, 0);
23710                              // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
23711                              vcvtt(CurrentCond(),
23712                                    F32,
23713                                    F16,
23714                                    SRegister(rd),
23715                                    SRegister(rm));
23716                              break;
23717                            }
23718                            case 0x00010000: {
23719                              // 0xeeb30a40
23720                              unsigned rd = ExtractSRegister(instr, 22, 12);
23721                              unsigned rm = ExtractSRegister(instr, 5, 0);
23722                              // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
23723                              vcvtb(CurrentCond(),
23724                                    F16,
23725                                    F32,
23726                                    SRegister(rd),
23727                                    SRegister(rm));
23728                              break;
23729                            }
23730                            case 0x00010080: {
23731                              // 0xeeb30ac0
23732                              unsigned rd = ExtractSRegister(instr, 22, 12);
23733                              unsigned rm = ExtractSRegister(instr, 5, 0);
23734                              // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
23735                              vcvtt(CurrentCond(),
23736                                    F16,
23737                                    F32,
23738                                    SRegister(rd),
23739                                    SRegister(rm));
23740                              break;
23741                            }
23742                          }
23743                          break;
23744                        }
23745                        case 0x00040000: {
23746                          // 0xeeb40a40
23747                          switch (instr & 0x00010080) {
23748                            case 0x00000000: {
23749                              // 0xeeb40a40
23750                              unsigned rd = ExtractSRegister(instr, 22, 12);
23751                              unsigned rm = ExtractSRegister(instr, 5, 0);
23752                              // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23753                              vcmp(CurrentCond(),
23754                                   F32,
23755                                   SRegister(rd),
23756                                   SRegister(rm));
23757                              break;
23758                            }
23759                            case 0x00000080: {
23760                              // 0xeeb40ac0
23761                              unsigned rd = ExtractSRegister(instr, 22, 12);
23762                              unsigned rm = ExtractSRegister(instr, 5, 0);
23763                              // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23764                              vcmpe(CurrentCond(),
23765                                    F32,
23766                                    SRegister(rd),
23767                                    SRegister(rm));
23768                              break;
23769                            }
23770                            case 0x00010000: {
23771                              // 0xeeb50a40
23772                              unsigned rd = ExtractSRegister(instr, 22, 12);
23773                              // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
23774                              vcmp(CurrentCond(), F32, SRegister(rd), 0.0);
23775                              if (((instr & 0xffbf0fff) != 0xeeb50a40)) {
23776                                UnpredictableT32(instr);
23777                              }
23778                              break;
23779                            }
23780                            case 0x00010080: {
23781                              // 0xeeb50ac0
23782                              unsigned rd = ExtractSRegister(instr, 22, 12);
23783                              // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
23784                              vcmpe(CurrentCond(), F32, SRegister(rd), 0.0);
23785                              if (((instr & 0xffbf0fff) != 0xeeb50ac0)) {
23786                                UnpredictableT32(instr);
23787                              }
23788                              break;
23789                            }
23790                          }
23791                          break;
23792                        }
23793                        case 0x00060000: {
23794                          // 0xeeb60a40
23795                          switch (instr & 0x00010080) {
23796                            case 0x00000000: {
23797                              // 0xeeb60a40
23798                              unsigned rd = ExtractSRegister(instr, 22, 12);
23799                              unsigned rm = ExtractSRegister(instr, 5, 0);
23800                              // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23801                              vrintr(CurrentCond(),
23802                                     F32,
23803                                     SRegister(rd),
23804                                     SRegister(rm));
23805                              break;
23806                            }
23807                            case 0x00000080: {
23808                              // 0xeeb60ac0
23809                              unsigned rd = ExtractSRegister(instr, 22, 12);
23810                              unsigned rm = ExtractSRegister(instr, 5, 0);
23811                              // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23812                              vrintz(CurrentCond(),
23813                                     F32,
23814                                     SRegister(rd),
23815                                     SRegister(rm));
23816                              break;
23817                            }
23818                            case 0x00010000: {
23819                              // 0xeeb70a40
23820                              unsigned rd = ExtractSRegister(instr, 22, 12);
23821                              unsigned rm = ExtractSRegister(instr, 5, 0);
23822                              // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23823                              vrintx(CurrentCond(),
23824                                     F32,
23825                                     SRegister(rd),
23826                                     SRegister(rm));
23827                              break;
23828                            }
23829                            case 0x00010080: {
23830                              // 0xeeb70ac0
23831                              unsigned rd = ExtractDRegister(instr, 22, 12);
23832                              unsigned rm = ExtractSRegister(instr, 5, 0);
23833                              // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; T1
23834                              vcvt(CurrentCond(),
23835                                   F64,
23836                                   F32,
23837                                   DRegister(rd),
23838                                   SRegister(rm));
23839                              break;
23840                            }
23841                          }
23842                          break;
23843                        }
23844                        case 0x00080000: {
23845                          // 0xeeb80a40
23846                          if ((instr & 0x00010000) == 0x00000000) {
23847                            DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
23848                            if (dt.Is(kDataTypeValueInvalid)) {
23849                              UnallocatedT32(instr);
23850                              return;
23851                            }
23852                            unsigned rd = ExtractSRegister(instr, 22, 12);
23853                            unsigned rm = ExtractSRegister(instr, 5, 0);
23854                            // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; T1
23855                            vcvt(CurrentCond(),
23856                                 F32,
23857                                 dt,
23858                                 SRegister(rd),
23859                                 SRegister(rm));
23860                          } else {
23861                            UnallocatedT32(instr);
23862                          }
23863                          break;
23864                        }
23865                        case 0x000a0000: {
23866                          // 0xeeba0a40
23867                          DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
23868                                                         ((instr >> 15) & 0x2));
23869                          if (dt.Is(kDataTypeValueInvalid)) {
23870                            UnallocatedT32(instr);
23871                            return;
23872                          }
23873                          unsigned rd = ExtractSRegister(instr, 22, 12);
23874                          unsigned offset = 32;
23875                          if (dt.Is(S16) || dt.Is(U16)) {
23876                            offset = 16;
23877                          }
23878                          uint32_t fbits = offset - (((instr >> 5) & 0x1) |
23879                                                     ((instr << 1) & 0x1e));
23880                          // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; T1
23881                          vcvt(CurrentCond(),
23882                               F32,
23883                               dt,
23884                               SRegister(rd),
23885                               SRegister(rd),
23886                               fbits);
23887                          break;
23888                        }
23889                        case 0x000c0000: {
23890                          // 0xeebc0a40
23891                          switch (instr & 0x00010080) {
23892                            case 0x00000000: {
23893                              // 0xeebc0a40
23894                              unsigned rd = ExtractSRegister(instr, 22, 12);
23895                              unsigned rm = ExtractSRegister(instr, 5, 0);
23896                              // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
23897                              vcvtr(CurrentCond(),
23898                                    U32,
23899                                    F32,
23900                                    SRegister(rd),
23901                                    SRegister(rm));
23902                              break;
23903                            }
23904                            case 0x00000080: {
23905                              // 0xeebc0ac0
23906                              unsigned rd = ExtractSRegister(instr, 22, 12);
23907                              unsigned rm = ExtractSRegister(instr, 5, 0);
23908                              // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
23909                              vcvt(CurrentCond(),
23910                                   U32,
23911                                   F32,
23912                                   SRegister(rd),
23913                                   SRegister(rm));
23914                              break;
23915                            }
23916                            case 0x00010000: {
23917                              // 0xeebd0a40
23918                              unsigned rd = ExtractSRegister(instr, 22, 12);
23919                              unsigned rm = ExtractSRegister(instr, 5, 0);
23920                              // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
23921                              vcvtr(CurrentCond(),
23922                                    S32,
23923                                    F32,
23924                                    SRegister(rd),
23925                                    SRegister(rm));
23926                              break;
23927                            }
23928                            case 0x00010080: {
23929                              // 0xeebd0ac0
23930                              unsigned rd = ExtractSRegister(instr, 22, 12);
23931                              unsigned rm = ExtractSRegister(instr, 5, 0);
23932                              // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
23933                              vcvt(CurrentCond(),
23934                                   S32,
23935                                   F32,
23936                                   SRegister(rd),
23937                                   SRegister(rm));
23938                              break;
23939                            }
23940                          }
23941                          break;
23942                        }
23943                        case 0x000e0000: {
23944                          // 0xeebe0a40
23945                          DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
23946                                                         ((instr >> 15) & 0x2));
23947                          if (dt.Is(kDataTypeValueInvalid)) {
23948                            UnallocatedT32(instr);
23949                            return;
23950                          }
23951                          unsigned rd = ExtractSRegister(instr, 22, 12);
23952                          unsigned offset = 32;
23953                          if (dt.Is(S16) || dt.Is(U16)) {
23954                            offset = 16;
23955                          }
23956                          uint32_t fbits = offset - (((instr >> 5) & 0x1) |
23957                                                     ((instr << 1) & 0x1e));
23958                          // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; T1
23959                          vcvt(CurrentCond(),
23960                               dt,
23961                               F32,
23962                               SRegister(rd),
23963                               SRegister(rd),
23964                               fbits);
23965                          break;
23966                        }
23967                      }
23968                      break;
23969                    }
23970                    case 0x00b00b00: {
23971                      // 0xeeb00b00
23972                      unsigned rd = ExtractDRegister(instr, 22, 12);
23973                      uint32_t encoded_imm =
23974                          (instr & 0xf) | ((instr >> 12) & 0xf0);
23975                      NeonImmediate imm =
23976                          ImmediateVFP::Decode<double>(encoded_imm);
23977                      // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; T2
23978                      vmov(CurrentCond(), F64, DRegister(rd), imm);
23979                      if (((instr & 0xffb00ff0) != 0xeeb00b00)) {
23980                        UnpredictableT32(instr);
23981                      }
23982                      break;
23983                    }
23984                    case 0x00b00b40: {
23985                      // 0xeeb00b40
23986                      switch (instr & 0x000e0000) {
23987                        case 0x00000000: {
23988                          // 0xeeb00b40
23989                          switch (instr & 0x00010080) {
23990                            case 0x00000000: {
23991                              // 0xeeb00b40
23992                              unsigned rd = ExtractDRegister(instr, 22, 12);
23993                              unsigned rm = ExtractDRegister(instr, 5, 0);
23994                              // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
23995                              vmov(CurrentCond(),
23996                                   F64,
23997                                   DRegister(rd),
23998                                   DRegister(rm));
23999                              break;
24000                            }
24001                            case 0x00000080: {
24002                              // 0xeeb00bc0
24003                              unsigned rd = ExtractDRegister(instr, 22, 12);
24004                              unsigned rm = ExtractDRegister(instr, 5, 0);
24005                              // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24006                              vabs(CurrentCond(),
24007                                   F64,
24008                                   DRegister(rd),
24009                                   DRegister(rm));
24010                              break;
24011                            }
24012                            case 0x00010000: {
24013                              // 0xeeb10b40
24014                              unsigned rd = ExtractDRegister(instr, 22, 12);
24015                              unsigned rm = ExtractDRegister(instr, 5, 0);
24016                              // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24017                              vneg(CurrentCond(),
24018                                   F64,
24019                                   DRegister(rd),
24020                                   DRegister(rm));
24021                              break;
24022                            }
24023                            case 0x00010080: {
24024                              // 0xeeb10bc0
24025                              unsigned rd = ExtractDRegister(instr, 22, 12);
24026                              unsigned rm = ExtractDRegister(instr, 5, 0);
24027                              // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24028                              vsqrt(CurrentCond(),
24029                                    F64,
24030                                    DRegister(rd),
24031                                    DRegister(rm));
24032                              break;
24033                            }
24034                          }
24035                          break;
24036                        }
24037                        case 0x00020000: {
24038                          // 0xeeb20b40
24039                          switch (instr & 0x00010080) {
24040                            case 0x00000000: {
24041                              // 0xeeb20b40
24042                              unsigned rd = ExtractDRegister(instr, 22, 12);
24043                              unsigned rm = ExtractSRegister(instr, 5, 0);
24044                              // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
24045                              vcvtb(CurrentCond(),
24046                                    F64,
24047                                    F16,
24048                                    DRegister(rd),
24049                                    SRegister(rm));
24050                              break;
24051                            }
24052                            case 0x00000080: {
24053                              // 0xeeb20bc0
24054                              unsigned rd = ExtractDRegister(instr, 22, 12);
24055                              unsigned rm = ExtractSRegister(instr, 5, 0);
24056                              // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
24057                              vcvtt(CurrentCond(),
24058                                    F64,
24059                                    F16,
24060                                    DRegister(rd),
24061                                    SRegister(rm));
24062                              break;
24063                            }
24064                            case 0x00010000: {
24065                              // 0xeeb30b40
24066                              unsigned rd = ExtractSRegister(instr, 22, 12);
24067                              unsigned rm = ExtractDRegister(instr, 5, 0);
24068                              // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
24069                              vcvtb(CurrentCond(),
24070                                    F16,
24071                                    F64,
24072                                    SRegister(rd),
24073                                    DRegister(rm));
24074                              break;
24075                            }
24076                            case 0x00010080: {
24077                              // 0xeeb30bc0
24078                              unsigned rd = ExtractSRegister(instr, 22, 12);
24079                              unsigned rm = ExtractDRegister(instr, 5, 0);
24080                              // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
24081                              vcvtt(CurrentCond(),
24082                                    F16,
24083                                    F64,
24084                                    SRegister(rd),
24085                                    DRegister(rm));
24086                              break;
24087                            }
24088                          }
24089                          break;
24090                        }
24091                        case 0x00040000: {
24092                          // 0xeeb40b40
24093                          switch (instr & 0x00010080) {
24094                            case 0x00000000: {
24095                              // 0xeeb40b40
24096                              unsigned rd = ExtractDRegister(instr, 22, 12);
24097                              unsigned rm = ExtractDRegister(instr, 5, 0);
24098                              // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24099                              vcmp(CurrentCond(),
24100                                   F64,
24101                                   DRegister(rd),
24102                                   DRegister(rm));
24103                              break;
24104                            }
24105                            case 0x00000080: {
24106                              // 0xeeb40bc0
24107                              unsigned rd = ExtractDRegister(instr, 22, 12);
24108                              unsigned rm = ExtractDRegister(instr, 5, 0);
24109                              // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24110                              vcmpe(CurrentCond(),
24111                                    F64,
24112                                    DRegister(rd),
24113                                    DRegister(rm));
24114                              break;
24115                            }
24116                            case 0x00010000: {
24117                              // 0xeeb50b40
24118                              unsigned rd = ExtractDRegister(instr, 22, 12);
24119                              // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
24120                              vcmp(CurrentCond(), F64, DRegister(rd), 0.0);
24121                              if (((instr & 0xffbf0fff) != 0xeeb50b40)) {
24122                                UnpredictableT32(instr);
24123                              }
24124                              break;
24125                            }
24126                            case 0x00010080: {
24127                              // 0xeeb50bc0
24128                              unsigned rd = ExtractDRegister(instr, 22, 12);
24129                              // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
24130                              vcmpe(CurrentCond(), F64, DRegister(rd), 0.0);
24131                              if (((instr & 0xffbf0fff) != 0xeeb50bc0)) {
24132                                UnpredictableT32(instr);
24133                              }
24134                              break;
24135                            }
24136                          }
24137                          break;
24138                        }
24139                        case 0x00060000: {
24140                          // 0xeeb60b40
24141                          switch (instr & 0x00010080) {
24142                            case 0x00000000: {
24143                              // 0xeeb60b40
24144                              unsigned rd = ExtractDRegister(instr, 22, 12);
24145                              unsigned rm = ExtractDRegister(instr, 5, 0);
24146                              // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24147                              vrintr(CurrentCond(),
24148                                     F64,
24149                                     DRegister(rd),
24150                                     DRegister(rm));
24151                              break;
24152                            }
24153                            case 0x00000080: {
24154                              // 0xeeb60bc0
24155                              unsigned rd = ExtractDRegister(instr, 22, 12);
24156                              unsigned rm = ExtractDRegister(instr, 5, 0);
24157                              // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24158                              vrintz(CurrentCond(),
24159                                     F64,
24160                                     DRegister(rd),
24161                                     DRegister(rm));
24162                              break;
24163                            }
24164                            case 0x00010000: {
24165                              // 0xeeb70b40
24166                              unsigned rd = ExtractDRegister(instr, 22, 12);
24167                              unsigned rm = ExtractDRegister(instr, 5, 0);
24168                              // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24169                              vrintx(CurrentCond(),
24170                                     F64,
24171                                     DRegister(rd),
24172                                     DRegister(rm));
24173                              break;
24174                            }
24175                            case 0x00010080: {
24176                              // 0xeeb70bc0
24177                              unsigned rd = ExtractSRegister(instr, 22, 12);
24178                              unsigned rm = ExtractDRegister(instr, 5, 0);
24179                              // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; T1
24180                              vcvt(CurrentCond(),
24181                                   F32,
24182                                   F64,
24183                                   SRegister(rd),
24184                                   DRegister(rm));
24185                              break;
24186                            }
24187                          }
24188                          break;
24189                        }
24190                        case 0x00080000: {
24191                          // 0xeeb80b40
24192                          if ((instr & 0x00010000) == 0x00000000) {
24193                            DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24194                            if (dt.Is(kDataTypeValueInvalid)) {
24195                              UnallocatedT32(instr);
24196                              return;
24197                            }
24198                            unsigned rd = ExtractDRegister(instr, 22, 12);
24199                            unsigned rm = ExtractSRegister(instr, 5, 0);
24200                            // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; T1
24201                            vcvt(CurrentCond(),
24202                                 F64,
24203                                 dt,
24204                                 DRegister(rd),
24205                                 SRegister(rm));
24206                          } else {
24207                            UnallocatedT32(instr);
24208                          }
24209                          break;
24210                        }
24211                        case 0x000a0000: {
24212                          // 0xeeba0b40
24213                          DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24214                                                         ((instr >> 15) & 0x2));
24215                          if (dt.Is(kDataTypeValueInvalid)) {
24216                            UnallocatedT32(instr);
24217                            return;
24218                          }
24219                          unsigned rd = ExtractDRegister(instr, 22, 12);
24220                          unsigned offset = 32;
24221                          if (dt.Is(S16) || dt.Is(U16)) {
24222                            offset = 16;
24223                          }
24224                          uint32_t fbits = offset - (((instr >> 5) & 0x1) |
24225                                                     ((instr << 1) & 0x1e));
24226                          // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; T1
24227                          vcvt(CurrentCond(),
24228                               F64,
24229                               dt,
24230                               DRegister(rd),
24231                               DRegister(rd),
24232                               fbits);
24233                          break;
24234                        }
24235                        case 0x000c0000: {
24236                          // 0xeebc0b40
24237                          switch (instr & 0x00010080) {
24238                            case 0x00000000: {
24239                              // 0xeebc0b40
24240                              unsigned rd = ExtractSRegister(instr, 22, 12);
24241                              unsigned rm = ExtractDRegister(instr, 5, 0);
24242                              // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
24243                              vcvtr(CurrentCond(),
24244                                    U32,
24245                                    F64,
24246                                    SRegister(rd),
24247                                    DRegister(rm));
24248                              break;
24249                            }
24250                            case 0x00000080: {
24251                              // 0xeebc0bc0
24252                              unsigned rd = ExtractSRegister(instr, 22, 12);
24253                              unsigned rm = ExtractDRegister(instr, 5, 0);
24254                              // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
24255                              vcvt(CurrentCond(),
24256                                   U32,
24257                                   F64,
24258                                   SRegister(rd),
24259                                   DRegister(rm));
24260                              break;
24261                            }
24262                            case 0x00010000: {
24263                              // 0xeebd0b40
24264                              unsigned rd = ExtractSRegister(instr, 22, 12);
24265                              unsigned rm = ExtractDRegister(instr, 5, 0);
24266                              // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
24267                              vcvtr(CurrentCond(),
24268                                    S32,
24269                                    F64,
24270                                    SRegister(rd),
24271                                    DRegister(rm));
24272                              break;
24273                            }
24274                            case 0x00010080: {
24275                              // 0xeebd0bc0
24276                              unsigned rd = ExtractSRegister(instr, 22, 12);
24277                              unsigned rm = ExtractDRegister(instr, 5, 0);
24278                              // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
24279                              vcvt(CurrentCond(),
24280                                   S32,
24281                                   F64,
24282                                   SRegister(rd),
24283                                   DRegister(rm));
24284                              break;
24285                            }
24286                          }
24287                          break;
24288                        }
24289                        case 0x000e0000: {
24290                          // 0xeebe0b40
24291                          DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24292                                                         ((instr >> 15) & 0x2));
24293                          if (dt.Is(kDataTypeValueInvalid)) {
24294                            UnallocatedT32(instr);
24295                            return;
24296                          }
24297                          unsigned rd = ExtractDRegister(instr, 22, 12);
24298                          unsigned offset = 32;
24299                          if (dt.Is(S16) || dt.Is(U16)) {
24300                            offset = 16;
24301                          }
24302                          uint32_t fbits = offset - (((instr >> 5) & 0x1) |
24303                                                     ((instr << 1) & 0x1e));
24304                          // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; T1
24305                          vcvt(CurrentCond(),
24306                               dt,
24307                               F64,
24308                               DRegister(rd),
24309                               DRegister(rd),
24310                               fbits);
24311                          break;
24312                        }
24313                      }
24314                      break;
24315                    }
24316                    case 0x10000a00: {
24317                      // 0xfe000a00
24318                      unsigned rd = ExtractSRegister(instr, 22, 12);
24319                      unsigned rn = ExtractSRegister(instr, 7, 16);
24320                      unsigned rm = ExtractSRegister(instr, 5, 0);
24321                      // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; T1
24322                      vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24323                      if (InITBlock()) {
24324                        UnpredictableT32(instr);
24325                      }
24326                      break;
24327                    }
24328                    case 0x10000b00: {
24329                      // 0xfe000b00
24330                      unsigned rd = ExtractDRegister(instr, 22, 12);
24331                      unsigned rn = ExtractDRegister(instr, 7, 16);
24332                      unsigned rm = ExtractDRegister(instr, 5, 0);
24333                      // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; T1
24334                      vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24335                      if (InITBlock()) {
24336                        UnpredictableT32(instr);
24337                      }
24338                      break;
24339                    }
24340                    case 0x10100a00: {
24341                      // 0xfe100a00
24342                      unsigned rd = ExtractSRegister(instr, 22, 12);
24343                      unsigned rn = ExtractSRegister(instr, 7, 16);
24344                      unsigned rm = ExtractSRegister(instr, 5, 0);
24345                      // VSELVS.F32 <Sd>, <Sn>, <Sm> ; T1
24346                      vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24347                      if (InITBlock()) {
24348                        UnpredictableT32(instr);
24349                      }
24350                      break;
24351                    }
24352                    case 0x10100b00: {
24353                      // 0xfe100b00
24354                      unsigned rd = ExtractDRegister(instr, 22, 12);
24355                      unsigned rn = ExtractDRegister(instr, 7, 16);
24356                      unsigned rm = ExtractDRegister(instr, 5, 0);
24357                      // VSELVS.F64 <Dd>, <Dn>, <Dm> ; T1
24358                      vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24359                      if (InITBlock()) {
24360                        UnpredictableT32(instr);
24361                      }
24362                      break;
24363                    }
24364                    case 0x10200a00: {
24365                      // 0xfe200a00
24366                      unsigned rd = ExtractSRegister(instr, 22, 12);
24367                      unsigned rn = ExtractSRegister(instr, 7, 16);
24368                      unsigned rm = ExtractSRegister(instr, 5, 0);
24369                      // VSELGE.F32 <Sd>, <Sn>, <Sm> ; T1
24370                      vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24371                      if (InITBlock()) {
24372                        UnpredictableT32(instr);
24373                      }
24374                      break;
24375                    }
24376                    case 0x10200b00: {
24377                      // 0xfe200b00
24378                      unsigned rd = ExtractDRegister(instr, 22, 12);
24379                      unsigned rn = ExtractDRegister(instr, 7, 16);
24380                      unsigned rm = ExtractDRegister(instr, 5, 0);
24381                      // VSELGE.F64 <Dd>, <Dn>, <Dm> ; T1
24382                      vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24383                      if (InITBlock()) {
24384                        UnpredictableT32(instr);
24385                      }
24386                      break;
24387                    }
24388                    case 0x10300a00: {
24389                      // 0xfe300a00
24390                      unsigned rd = ExtractSRegister(instr, 22, 12);
24391                      unsigned rn = ExtractSRegister(instr, 7, 16);
24392                      unsigned rm = ExtractSRegister(instr, 5, 0);
24393                      // VSELGT.F32 <Sd>, <Sn>, <Sm> ; T1
24394                      vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24395                      if (InITBlock()) {
24396                        UnpredictableT32(instr);
24397                      }
24398                      break;
24399                    }
24400                    case 0x10300b00: {
24401                      // 0xfe300b00
24402                      unsigned rd = ExtractDRegister(instr, 22, 12);
24403                      unsigned rn = ExtractDRegister(instr, 7, 16);
24404                      unsigned rm = ExtractDRegister(instr, 5, 0);
24405                      // VSELGT.F64 <Dd>, <Dn>, <Dm> ; T1
24406                      vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24407                      if (InITBlock()) {
24408                        UnpredictableT32(instr);
24409                      }
24410                      break;
24411                    }
24412                    case 0x10800a00: {
24413                      // 0xfe800a00
24414                      unsigned rd = ExtractSRegister(instr, 22, 12);
24415                      unsigned rn = ExtractSRegister(instr, 7, 16);
24416                      unsigned rm = ExtractSRegister(instr, 5, 0);
24417                      // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
24418                      vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24419                      if (InITBlock()) {
24420                        UnpredictableT32(instr);
24421                      }
24422                      break;
24423                    }
24424                    case 0x10800a40: {
24425                      // 0xfe800a40
24426                      unsigned rd = ExtractSRegister(instr, 22, 12);
24427                      unsigned rn = ExtractSRegister(instr, 7, 16);
24428                      unsigned rm = ExtractSRegister(instr, 5, 0);
24429                      // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
24430                      vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
24431                      if (InITBlock()) {
24432                        UnpredictableT32(instr);
24433                      }
24434                      break;
24435                    }
24436                    case 0x10800b00: {
24437                      // 0xfe800b00
24438                      unsigned rd = ExtractDRegister(instr, 22, 12);
24439                      unsigned rn = ExtractDRegister(instr, 7, 16);
24440                      unsigned rm = ExtractDRegister(instr, 5, 0);
24441                      // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
24442                      vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24443                      if (InITBlock()) {
24444                        UnpredictableT32(instr);
24445                      }
24446                      break;
24447                    }
24448                    case 0x10800b40: {
24449                      // 0xfe800b40
24450                      unsigned rd = ExtractDRegister(instr, 22, 12);
24451                      unsigned rn = ExtractDRegister(instr, 7, 16);
24452                      unsigned rm = ExtractDRegister(instr, 5, 0);
24453                      // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
24454                      vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
24455                      if (InITBlock()) {
24456                        UnpredictableT32(instr);
24457                      }
24458                      break;
24459                    }
24460                    case 0x10b00a40: {
24461                      // 0xfeb00a40
24462                      switch (instr & 0x000f0000) {
24463                        case 0x00080000: {
24464                          // 0xfeb80a40
24465                          if ((instr & 0x00000080) == 0x00000000) {
24466                            unsigned rd = ExtractSRegister(instr, 22, 12);
24467                            unsigned rm = ExtractSRegister(instr, 5, 0);
24468                            // VRINTA{<q>}.F32 <Sd>, <Sm> ; T1
24469                            vrinta(F32, SRegister(rd), SRegister(rm));
24470                          } else {
24471                            UnallocatedT32(instr);
24472                          }
24473                          break;
24474                        }
24475                        case 0x00090000: {
24476                          // 0xfeb90a40
24477                          if ((instr & 0x00000080) == 0x00000000) {
24478                            unsigned rd = ExtractSRegister(instr, 22, 12);
24479                            unsigned rm = ExtractSRegister(instr, 5, 0);
24480                            // VRINTN{<q>}.F32 <Sd>, <Sm> ; T1
24481                            vrintn(F32, SRegister(rd), SRegister(rm));
24482                          } else {
24483                            UnallocatedT32(instr);
24484                          }
24485                          break;
24486                        }
24487                        case 0x000a0000: {
24488                          // 0xfeba0a40
24489                          if ((instr & 0x00000080) == 0x00000000) {
24490                            unsigned rd = ExtractSRegister(instr, 22, 12);
24491                            unsigned rm = ExtractSRegister(instr, 5, 0);
24492                            // VRINTP{<q>}.F32 <Sd>, <Sm> ; T1
24493                            vrintp(F32, SRegister(rd), SRegister(rm));
24494                          } else {
24495                            UnallocatedT32(instr);
24496                          }
24497                          break;
24498                        }
24499                        case 0x000b0000: {
24500                          // 0xfebb0a40
24501                          if ((instr & 0x00000080) == 0x00000000) {
24502                            unsigned rd = ExtractSRegister(instr, 22, 12);
24503                            unsigned rm = ExtractSRegister(instr, 5, 0);
24504                            // VRINTM{<q>}.F32 <Sd>, <Sm> ; T1
24505                            vrintm(F32, SRegister(rd), SRegister(rm));
24506                          } else {
24507                            UnallocatedT32(instr);
24508                          }
24509                          break;
24510                        }
24511                        case 0x000c0000: {
24512                          // 0xfebc0a40
24513                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24514                          if (dt.Is(kDataTypeValueInvalid)) {
24515                            UnallocatedT32(instr);
24516                            return;
24517                          }
24518                          unsigned rd = ExtractSRegister(instr, 22, 12);
24519                          unsigned rm = ExtractSRegister(instr, 5, 0);
24520                          // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24521                          vcvta(dt, F32, SRegister(rd), SRegister(rm));
24522                          break;
24523                        }
24524                        case 0x000d0000: {
24525                          // 0xfebd0a40
24526                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24527                          if (dt.Is(kDataTypeValueInvalid)) {
24528                            UnallocatedT32(instr);
24529                            return;
24530                          }
24531                          unsigned rd = ExtractSRegister(instr, 22, 12);
24532                          unsigned rm = ExtractSRegister(instr, 5, 0);
24533                          // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24534                          vcvtn(dt, F32, SRegister(rd), SRegister(rm));
24535                          break;
24536                        }
24537                        case 0x000e0000: {
24538                          // 0xfebe0a40
24539                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24540                          if (dt.Is(kDataTypeValueInvalid)) {
24541                            UnallocatedT32(instr);
24542                            return;
24543                          }
24544                          unsigned rd = ExtractSRegister(instr, 22, 12);
24545                          unsigned rm = ExtractSRegister(instr, 5, 0);
24546                          // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24547                          vcvtp(dt, F32, SRegister(rd), SRegister(rm));
24548                          break;
24549                        }
24550                        case 0x000f0000: {
24551                          // 0xfebf0a40
24552                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24553                          if (dt.Is(kDataTypeValueInvalid)) {
24554                            UnallocatedT32(instr);
24555                            return;
24556                          }
24557                          unsigned rd = ExtractSRegister(instr, 22, 12);
24558                          unsigned rm = ExtractSRegister(instr, 5, 0);
24559                          // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24560                          vcvtm(dt, F32, SRegister(rd), SRegister(rm));
24561                          break;
24562                        }
24563                        default:
24564                          UnallocatedT32(instr);
24565                          break;
24566                      }
24567                      break;
24568                    }
24569                    case 0x10b00b40: {
24570                      // 0xfeb00b40
24571                      switch (instr & 0x000f0000) {
24572                        case 0x00080000: {
24573                          // 0xfeb80b40
24574                          if ((instr & 0x00000080) == 0x00000000) {
24575                            unsigned rd = ExtractDRegister(instr, 22, 12);
24576                            unsigned rm = ExtractDRegister(instr, 5, 0);
24577                            // VRINTA{<q>}.F64 <Dd>, <Dm> ; T1
24578                            vrinta(F64, DRegister(rd), DRegister(rm));
24579                          } else {
24580                            UnallocatedT32(instr);
24581                          }
24582                          break;
24583                        }
24584                        case 0x00090000: {
24585                          // 0xfeb90b40
24586                          if ((instr & 0x00000080) == 0x00000000) {
24587                            unsigned rd = ExtractDRegister(instr, 22, 12);
24588                            unsigned rm = ExtractDRegister(instr, 5, 0);
24589                            // VRINTN{<q>}.F64 <Dd>, <Dm> ; T1
24590                            vrintn(F64, DRegister(rd), DRegister(rm));
24591                          } else {
24592                            UnallocatedT32(instr);
24593                          }
24594                          break;
24595                        }
24596                        case 0x000a0000: {
24597                          // 0xfeba0b40
24598                          if ((instr & 0x00000080) == 0x00000000) {
24599                            unsigned rd = ExtractDRegister(instr, 22, 12);
24600                            unsigned rm = ExtractDRegister(instr, 5, 0);
24601                            // VRINTP{<q>}.F64 <Dd>, <Dm> ; T1
24602                            vrintp(F64, DRegister(rd), DRegister(rm));
24603                          } else {
24604                            UnallocatedT32(instr);
24605                          }
24606                          break;
24607                        }
24608                        case 0x000b0000: {
24609                          // 0xfebb0b40
24610                          if ((instr & 0x00000080) == 0x00000000) {
24611                            unsigned rd = ExtractDRegister(instr, 22, 12);
24612                            unsigned rm = ExtractDRegister(instr, 5, 0);
24613                            // VRINTM{<q>}.F64 <Dd>, <Dm> ; T1
24614                            vrintm(F64, DRegister(rd), DRegister(rm));
24615                          } else {
24616                            UnallocatedT32(instr);
24617                          }
24618                          break;
24619                        }
24620                        case 0x000c0000: {
24621                          // 0xfebc0b40
24622                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24623                          if (dt.Is(kDataTypeValueInvalid)) {
24624                            UnallocatedT32(instr);
24625                            return;
24626                          }
24627                          unsigned rd = ExtractSRegister(instr, 22, 12);
24628                          unsigned rm = ExtractDRegister(instr, 5, 0);
24629                          // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24630                          vcvta(dt, F64, SRegister(rd), DRegister(rm));
24631                          break;
24632                        }
24633                        case 0x000d0000: {
24634                          // 0xfebd0b40
24635                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24636                          if (dt.Is(kDataTypeValueInvalid)) {
24637                            UnallocatedT32(instr);
24638                            return;
24639                          }
24640                          unsigned rd = ExtractSRegister(instr, 22, 12);
24641                          unsigned rm = ExtractDRegister(instr, 5, 0);
24642                          // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24643                          vcvtn(dt, F64, SRegister(rd), DRegister(rm));
24644                          break;
24645                        }
24646                        case 0x000e0000: {
24647                          // 0xfebe0b40
24648                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24649                          if (dt.Is(kDataTypeValueInvalid)) {
24650                            UnallocatedT32(instr);
24651                            return;
24652                          }
24653                          unsigned rd = ExtractSRegister(instr, 22, 12);
24654                          unsigned rm = ExtractDRegister(instr, 5, 0);
24655                          // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24656                          vcvtp(dt, F64, SRegister(rd), DRegister(rm));
24657                          break;
24658                        }
24659                        case 0x000f0000: {
24660                          // 0xfebf0b40
24661                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
24662                          if (dt.Is(kDataTypeValueInvalid)) {
24663                            UnallocatedT32(instr);
24664                            return;
24665                          }
24666                          unsigned rd = ExtractSRegister(instr, 22, 12);
24667                          unsigned rm = ExtractDRegister(instr, 5, 0);
24668                          // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24669                          vcvtm(dt, F64, SRegister(rd), DRegister(rm));
24670                          break;
24671                        }
24672                        default:
24673                          UnallocatedT32(instr);
24674                          break;
24675                      }
24676                      break;
24677                    }
24678                    default:
24679                      UnallocatedT32(instr);
24680                      break;
24681                  }
24682                  break;
24683                }
24684                case 0x00000010: {
24685                  // 0xee000010
24686                  switch (instr & 0x10100e00) {
24687                    case 0x00000a00: {
24688                      // 0xee000a10
24689                      switch (instr & 0x00800100) {
24690                        case 0x00000000: {
24691                          // 0xee000a10
24692                          if ((instr & 0x00600000) == 0x00000000) {
24693                            unsigned rn = ExtractSRegister(instr, 7, 16);
24694                            unsigned rt = (instr >> 12) & 0xf;
24695                            // VMOV{<c>}{<q>} <Sn>, <Rt> ; T1
24696                            vmov(CurrentCond(), SRegister(rn), Register(rt));
24697                            if (((instr & 0xfff00f7f) != 0xee000a10)) {
24698                              UnpredictableT32(instr);
24699                            }
24700                          } else {
24701                            UnallocatedT32(instr);
24702                          }
24703                          break;
24704                        }
24705                        case 0x00000100: {
24706                          // 0xee000b10
24707                          unsigned lane;
24708                          DataType dt =
24709                              Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
24710                                                        ((instr >> 19) & 0xc),
24711                                                    &lane);
24712                          if (dt.Is(kDataTypeValueInvalid)) {
24713                            UnallocatedT32(instr);
24714                            return;
24715                          }
24716                          unsigned rd = ExtractDRegister(instr, 7, 16);
24717                          unsigned rt = (instr >> 12) & 0xf;
24718                          // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; T1
24719                          vmov(CurrentCond(),
24720                               dt,
24721                               DRegisterLane(rd, lane),
24722                               Register(rt));
24723                          if (((instr & 0xff900f1f) != 0xee000b10)) {
24724                            UnpredictableT32(instr);
24725                          }
24726                          break;
24727                        }
24728                        case 0x00800000: {
24729                          // 0xee800a10
24730                          if ((instr & 0x00600000) == 0x00600000) {
24731                            unsigned spec_reg = (instr >> 16) & 0xf;
24732                            unsigned rt = (instr >> 12) & 0xf;
24733                            switch (spec_reg) {
24734                              case 0x0:
24735                              case 0x1:
24736                              case 0x8: {
24737                                // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; T1
24738                                vmsr(CurrentCond(),
24739                                     SpecialFPRegister(spec_reg),
24740                                     Register(rt));
24741                                if (((instr & 0xfff00fff) != 0xeee00a10)) {
24742                                  UnpredictableT32(instr);
24743                                }
24744                                break;
24745                              }
24746                              default:
24747                                UnallocatedT32(instr);
24748                                break;
24749                            }
24750                          } else {
24751                            UnallocatedT32(instr);
24752                          }
24753                          break;
24754                        }
24755                        case 0x00800100: {
24756                          // 0xee800b10
24757                          switch (instr & 0x00200040) {
24758                            case 0x00000000: {
24759                              // 0xee800b10
24760                              DataType dt = Dt_B_E_1_Decode(
24761                                  ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2));
24762                              if (dt.Is(kDataTypeValueInvalid)) {
24763                                UnallocatedT32(instr);
24764                                return;
24765                              }
24766                              unsigned rd = ExtractDRegister(instr, 7, 16);
24767                              unsigned rt = (instr >> 12) & 0xf;
24768                              // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; T1
24769                              vdup(CurrentCond(),
24770                                   dt,
24771                                   DRegister(rd),
24772                                   Register(rt));
24773                              if (((instr & 0xffb00f5f) != 0xee800b10)) {
24774                                UnpredictableT32(instr);
24775                              }
24776                              break;
24777                            }
24778                            case 0x00200000: {
24779                              // 0xeea00b10
24780                              DataType dt = Dt_B_E_1_Decode(
24781                                  ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2));
24782                              if (dt.Is(kDataTypeValueInvalid)) {
24783                                UnallocatedT32(instr);
24784                                return;
24785                              }
24786                              if (((instr >> 16) & 1) != 0) {
24787                                UnallocatedT32(instr);
24788                                return;
24789                              }
24790                              unsigned rd = ExtractQRegister(instr, 7, 16);
24791                              unsigned rt = (instr >> 12) & 0xf;
24792                              // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; T1
24793                              vdup(CurrentCond(),
24794                                   dt,
24795                                   QRegister(rd),
24796                                   Register(rt));
24797                              if (((instr & 0xffb00f5f) != 0xeea00b10)) {
24798                                UnpredictableT32(instr);
24799                              }
24800                              break;
24801                            }
24802                            default:
24803                              UnallocatedT32(instr);
24804                              break;
24805                          }
24806                          break;
24807                        }
24808                      }
24809                      break;
24810                    }
24811                    case 0x00000e00: {
24812                      // 0xee000e10
24813                      UnimplementedT32_32("MCR", instr);
24814                      break;
24815                    }
24816                    case 0x00100a00: {
24817                      // 0xee100a10
24818                      switch (instr & 0x00000100) {
24819                        case 0x00000000: {
24820                          // 0xee100a10
24821                          switch (instr & 0x00e00000) {
24822                            case 0x00000000: {
24823                              // 0xee100a10
24824                              unsigned rt = (instr >> 12) & 0xf;
24825                              unsigned rn = ExtractSRegister(instr, 7, 16);
24826                              // VMOV{<c>}{<q>} <Rt>, <Sn> ; T1
24827                              vmov(CurrentCond(), Register(rt), SRegister(rn));
24828                              if (((instr & 0xfff00f7f) != 0xee100a10)) {
24829                                UnpredictableT32(instr);
24830                              }
24831                              break;
24832                            }
24833                            case 0x00e00000: {
24834                              // 0xeef00a10
24835                              unsigned rt = (instr >> 12) & 0xf;
24836                              unsigned spec_reg = (instr >> 16) & 0xf;
24837                              switch (spec_reg) {
24838                                case 0x0:
24839                                case 0x1:
24840                                case 0x5:
24841                                case 0x6:
24842                                case 0x7:
24843                                case 0x8: {
24844                                  // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; T1
24845                                  vmrs(CurrentCond(),
24846                                       RegisterOrAPSR_nzcv(rt),
24847                                       SpecialFPRegister(spec_reg));
24848                                  if (((instr & 0xfff00fff) != 0xeef00a10)) {
24849                                    UnpredictableT32(instr);
24850                                  }
24851                                  break;
24852                                }
24853                                default:
24854                                  UnallocatedT32(instr);
24855                                  break;
24856                              }
24857                              break;
24858                            }
24859                            default:
24860                              UnallocatedT32(instr);
24861                              break;
24862                          }
24863                          break;
24864                        }
24865                        case 0x00000100: {
24866                          // 0xee100b10
24867                          unsigned lane;
24868                          DataType dt =
24869                              Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
24870                                                          ((instr >> 19) &
24871                                                           0xc) |
24872                                                          ((instr >> 19) &
24873                                                           0x10),
24874                                                      &lane);
24875                          if (dt.Is(kDataTypeValueInvalid)) {
24876                            UnallocatedT32(instr);
24877                            return;
24878                          }
24879                          unsigned rt = (instr >> 12) & 0xf;
24880                          unsigned rn = ExtractDRegister(instr, 7, 16);
24881                          // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; T1
24882                          vmov(CurrentCond(),
24883                               dt,
24884                               Register(rt),
24885                               DRegisterLane(rn, lane));
24886                          if (((instr & 0xff100f1f) != 0xee100b10)) {
24887                            UnpredictableT32(instr);
24888                          }
24889                          break;
24890                        }
24891                      }
24892                      break;
24893                    }
24894                    case 0x00100e00: {
24895                      // 0xee100e10
24896                      UnimplementedT32_32("MRC", instr);
24897                      break;
24898                    }
24899                    default:
24900                      UnallocatedT32(instr);
24901                      break;
24902                  }
24903                  break;
24904                }
24905                case 0x01000000: {
24906                  // 0xef000000
24907                  switch (instr & 0x00800000) {
24908                    case 0x00000000: {
24909                      // 0xef000000
24910                      switch (instr & 0x00000f40) {
24911                        case 0x00000000: {
24912                          // 0xef000000
24913                          DataType dt = Dt_U_size_1_Decode(
24914                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
24915                          if (dt.Is(kDataTypeValueInvalid)) {
24916                            UnallocatedT32(instr);
24917                            return;
24918                          }
24919                          unsigned rd = ExtractDRegister(instr, 22, 12);
24920                          unsigned rn = ExtractDRegister(instr, 7, 16);
24921                          unsigned rm = ExtractDRegister(instr, 5, 0);
24922                          // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
24923                          vhadd(CurrentCond(),
24924                                dt,
24925                                DRegister(rd),
24926                                DRegister(rn),
24927                                DRegister(rm));
24928                          break;
24929                        }
24930                        case 0x00000040: {
24931                          // 0xef000040
24932                          DataType dt = Dt_U_size_1_Decode(
24933                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
24934                          if (dt.Is(kDataTypeValueInvalid)) {
24935                            UnallocatedT32(instr);
24936                            return;
24937                          }
24938                          if (((instr >> 12) & 1) != 0) {
24939                            UnallocatedT32(instr);
24940                            return;
24941                          }
24942                          unsigned rd = ExtractQRegister(instr, 22, 12);
24943                          if (((instr >> 16) & 1) != 0) {
24944                            UnallocatedT32(instr);
24945                            return;
24946                          }
24947                          unsigned rn = ExtractQRegister(instr, 7, 16);
24948                          if ((instr & 1) != 0) {
24949                            UnallocatedT32(instr);
24950                            return;
24951                          }
24952                          unsigned rm = ExtractQRegister(instr, 5, 0);
24953                          // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
24954                          vhadd(CurrentCond(),
24955                                dt,
24956                                QRegister(rd),
24957                                QRegister(rn),
24958                                QRegister(rm));
24959                          break;
24960                        }
24961                        case 0x00000100: {
24962                          // 0xef000100
24963                          DataType dt = Dt_U_size_1_Decode(
24964                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
24965                          if (dt.Is(kDataTypeValueInvalid)) {
24966                            UnallocatedT32(instr);
24967                            return;
24968                          }
24969                          unsigned rd = ExtractDRegister(instr, 22, 12);
24970                          unsigned rn = ExtractDRegister(instr, 7, 16);
24971                          unsigned rm = ExtractDRegister(instr, 5, 0);
24972                          // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
24973                          vrhadd(CurrentCond(),
24974                                 dt,
24975                                 DRegister(rd),
24976                                 DRegister(rn),
24977                                 DRegister(rm));
24978                          break;
24979                        }
24980                        case 0x00000140: {
24981                          // 0xef000140
24982                          DataType dt = Dt_U_size_1_Decode(
24983                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
24984                          if (dt.Is(kDataTypeValueInvalid)) {
24985                            UnallocatedT32(instr);
24986                            return;
24987                          }
24988                          if (((instr >> 12) & 1) != 0) {
24989                            UnallocatedT32(instr);
24990                            return;
24991                          }
24992                          unsigned rd = ExtractQRegister(instr, 22, 12);
24993                          if (((instr >> 16) & 1) != 0) {
24994                            UnallocatedT32(instr);
24995                            return;
24996                          }
24997                          unsigned rn = ExtractQRegister(instr, 7, 16);
24998                          if ((instr & 1) != 0) {
24999                            UnallocatedT32(instr);
25000                            return;
25001                          }
25002                          unsigned rm = ExtractQRegister(instr, 5, 0);
25003                          // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25004                          vrhadd(CurrentCond(),
25005                                 dt,
25006                                 QRegister(rd),
25007                                 QRegister(rn),
25008                                 QRegister(rm));
25009                          break;
25010                        }
25011                        case 0x00000200: {
25012                          // 0xef000200
25013                          DataType dt = Dt_U_size_1_Decode(
25014                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25015                          if (dt.Is(kDataTypeValueInvalid)) {
25016                            UnallocatedT32(instr);
25017                            return;
25018                          }
25019                          unsigned rd = ExtractDRegister(instr, 22, 12);
25020                          unsigned rn = ExtractDRegister(instr, 7, 16);
25021                          unsigned rm = ExtractDRegister(instr, 5, 0);
25022                          // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25023                          vhsub(CurrentCond(),
25024                                dt,
25025                                DRegister(rd),
25026                                DRegister(rn),
25027                                DRegister(rm));
25028                          break;
25029                        }
25030                        case 0x00000240: {
25031                          // 0xef000240
25032                          DataType dt = Dt_U_size_1_Decode(
25033                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25034                          if (dt.Is(kDataTypeValueInvalid)) {
25035                            UnallocatedT32(instr);
25036                            return;
25037                          }
25038                          if (((instr >> 12) & 1) != 0) {
25039                            UnallocatedT32(instr);
25040                            return;
25041                          }
25042                          unsigned rd = ExtractQRegister(instr, 22, 12);
25043                          if (((instr >> 16) & 1) != 0) {
25044                            UnallocatedT32(instr);
25045                            return;
25046                          }
25047                          unsigned rn = ExtractQRegister(instr, 7, 16);
25048                          if ((instr & 1) != 0) {
25049                            UnallocatedT32(instr);
25050                            return;
25051                          }
25052                          unsigned rm = ExtractQRegister(instr, 5, 0);
25053                          // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25054                          vhsub(CurrentCond(),
25055                                dt,
25056                                QRegister(rd),
25057                                QRegister(rn),
25058                                QRegister(rm));
25059                          break;
25060                        }
25061                        case 0x00000300: {
25062                          // 0xef000300
25063                          DataType dt = Dt_U_size_1_Decode(
25064                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25065                          if (dt.Is(kDataTypeValueInvalid)) {
25066                            UnallocatedT32(instr);
25067                            return;
25068                          }
25069                          unsigned rd = ExtractDRegister(instr, 22, 12);
25070                          unsigned rn = ExtractDRegister(instr, 7, 16);
25071                          unsigned rm = ExtractDRegister(instr, 5, 0);
25072                          // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25073                          vcgt(CurrentCond(),
25074                               dt,
25075                               DRegister(rd),
25076                               DRegister(rn),
25077                               DRegister(rm));
25078                          break;
25079                        }
25080                        case 0x00000340: {
25081                          // 0xef000340
25082                          DataType dt = Dt_U_size_1_Decode(
25083                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25084                          if (dt.Is(kDataTypeValueInvalid)) {
25085                            UnallocatedT32(instr);
25086                            return;
25087                          }
25088                          if (((instr >> 12) & 1) != 0) {
25089                            UnallocatedT32(instr);
25090                            return;
25091                          }
25092                          unsigned rd = ExtractQRegister(instr, 22, 12);
25093                          if (((instr >> 16) & 1) != 0) {
25094                            UnallocatedT32(instr);
25095                            return;
25096                          }
25097                          unsigned rn = ExtractQRegister(instr, 7, 16);
25098                          if ((instr & 1) != 0) {
25099                            UnallocatedT32(instr);
25100                            return;
25101                          }
25102                          unsigned rm = ExtractQRegister(instr, 5, 0);
25103                          // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25104                          vcgt(CurrentCond(),
25105                               dt,
25106                               QRegister(rd),
25107                               QRegister(rn),
25108                               QRegister(rm));
25109                          break;
25110                        }
25111                        case 0x00000400: {
25112                          // 0xef000400
25113                          DataType dt = Dt_U_size_3_Decode(
25114                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25115                          if (dt.Is(kDataTypeValueInvalid)) {
25116                            UnallocatedT32(instr);
25117                            return;
25118                          }
25119                          unsigned rd = ExtractDRegister(instr, 22, 12);
25120                          unsigned rm = ExtractDRegister(instr, 5, 0);
25121                          unsigned rn = ExtractDRegister(instr, 7, 16);
25122                          // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
25123                          vshl(CurrentCond(),
25124                               dt,
25125                               DRegister(rd),
25126                               DRegister(rm),
25127                               DRegister(rn));
25128                          break;
25129                        }
25130                        case 0x00000440: {
25131                          // 0xef000440
25132                          DataType dt = Dt_U_size_3_Decode(
25133                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25134                          if (dt.Is(kDataTypeValueInvalid)) {
25135                            UnallocatedT32(instr);
25136                            return;
25137                          }
25138                          if (((instr >> 12) & 1) != 0) {
25139                            UnallocatedT32(instr);
25140                            return;
25141                          }
25142                          unsigned rd = ExtractQRegister(instr, 22, 12);
25143                          if ((instr & 1) != 0) {
25144                            UnallocatedT32(instr);
25145                            return;
25146                          }
25147                          unsigned rm = ExtractQRegister(instr, 5, 0);
25148                          if (((instr >> 16) & 1) != 0) {
25149                            UnallocatedT32(instr);
25150                            return;
25151                          }
25152                          unsigned rn = ExtractQRegister(instr, 7, 16);
25153                          // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
25154                          vshl(CurrentCond(),
25155                               dt,
25156                               QRegister(rd),
25157                               QRegister(rm),
25158                               QRegister(rn));
25159                          break;
25160                        }
25161                        case 0x00000500: {
25162                          // 0xef000500
25163                          DataType dt = Dt_U_size_3_Decode(
25164                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25165                          if (dt.Is(kDataTypeValueInvalid)) {
25166                            UnallocatedT32(instr);
25167                            return;
25168                          }
25169                          unsigned rd = ExtractDRegister(instr, 22, 12);
25170                          unsigned rm = ExtractDRegister(instr, 5, 0);
25171                          unsigned rn = ExtractDRegister(instr, 7, 16);
25172                          // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
25173                          vrshl(CurrentCond(),
25174                                dt,
25175                                DRegister(rd),
25176                                DRegister(rm),
25177                                DRegister(rn));
25178                          break;
25179                        }
25180                        case 0x00000540: {
25181                          // 0xef000540
25182                          DataType dt = Dt_U_size_3_Decode(
25183                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25184                          if (dt.Is(kDataTypeValueInvalid)) {
25185                            UnallocatedT32(instr);
25186                            return;
25187                          }
25188                          if (((instr >> 12) & 1) != 0) {
25189                            UnallocatedT32(instr);
25190                            return;
25191                          }
25192                          unsigned rd = ExtractQRegister(instr, 22, 12);
25193                          if ((instr & 1) != 0) {
25194                            UnallocatedT32(instr);
25195                            return;
25196                          }
25197                          unsigned rm = ExtractQRegister(instr, 5, 0);
25198                          if (((instr >> 16) & 1) != 0) {
25199                            UnallocatedT32(instr);
25200                            return;
25201                          }
25202                          unsigned rn = ExtractQRegister(instr, 7, 16);
25203                          // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
25204                          vrshl(CurrentCond(),
25205                                dt,
25206                                QRegister(rd),
25207                                QRegister(rm),
25208                                QRegister(rn));
25209                          break;
25210                        }
25211                        case 0x00000600: {
25212                          // 0xef000600
25213                          DataType dt = Dt_U_size_1_Decode(
25214                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25215                          if (dt.Is(kDataTypeValueInvalid)) {
25216                            UnallocatedT32(instr);
25217                            return;
25218                          }
25219                          unsigned rd = ExtractDRegister(instr, 22, 12);
25220                          unsigned rn = ExtractDRegister(instr, 7, 16);
25221                          unsigned rm = ExtractDRegister(instr, 5, 0);
25222                          // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25223                          vmax(CurrentCond(),
25224                               dt,
25225                               DRegister(rd),
25226                               DRegister(rn),
25227                               DRegister(rm));
25228                          break;
25229                        }
25230                        case 0x00000640: {
25231                          // 0xef000640
25232                          DataType dt = Dt_U_size_1_Decode(
25233                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25234                          if (dt.Is(kDataTypeValueInvalid)) {
25235                            UnallocatedT32(instr);
25236                            return;
25237                          }
25238                          if (((instr >> 12) & 1) != 0) {
25239                            UnallocatedT32(instr);
25240                            return;
25241                          }
25242                          unsigned rd = ExtractQRegister(instr, 22, 12);
25243                          if (((instr >> 16) & 1) != 0) {
25244                            UnallocatedT32(instr);
25245                            return;
25246                          }
25247                          unsigned rn = ExtractQRegister(instr, 7, 16);
25248                          if ((instr & 1) != 0) {
25249                            UnallocatedT32(instr);
25250                            return;
25251                          }
25252                          unsigned rm = ExtractQRegister(instr, 5, 0);
25253                          // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25254                          vmax(CurrentCond(),
25255                               dt,
25256                               QRegister(rd),
25257                               QRegister(rn),
25258                               QRegister(rm));
25259                          break;
25260                        }
25261                        case 0x00000700: {
25262                          // 0xef000700
25263                          DataType dt = Dt_U_size_1_Decode(
25264                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25265                          if (dt.Is(kDataTypeValueInvalid)) {
25266                            UnallocatedT32(instr);
25267                            return;
25268                          }
25269                          unsigned rd = ExtractDRegister(instr, 22, 12);
25270                          unsigned rn = ExtractDRegister(instr, 7, 16);
25271                          unsigned rm = ExtractDRegister(instr, 5, 0);
25272                          // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25273                          vabd(CurrentCond(),
25274                               dt,
25275                               DRegister(rd),
25276                               DRegister(rn),
25277                               DRegister(rm));
25278                          break;
25279                        }
25280                        case 0x00000740: {
25281                          // 0xef000740
25282                          DataType dt = Dt_U_size_1_Decode(
25283                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25284                          if (dt.Is(kDataTypeValueInvalid)) {
25285                            UnallocatedT32(instr);
25286                            return;
25287                          }
25288                          if (((instr >> 12) & 1) != 0) {
25289                            UnallocatedT32(instr);
25290                            return;
25291                          }
25292                          unsigned rd = ExtractQRegister(instr, 22, 12);
25293                          if (((instr >> 16) & 1) != 0) {
25294                            UnallocatedT32(instr);
25295                            return;
25296                          }
25297                          unsigned rn = ExtractQRegister(instr, 7, 16);
25298                          if ((instr & 1) != 0) {
25299                            UnallocatedT32(instr);
25300                            return;
25301                          }
25302                          unsigned rm = ExtractQRegister(instr, 5, 0);
25303                          // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25304                          vabd(CurrentCond(),
25305                               dt,
25306                               QRegister(rd),
25307                               QRegister(rn),
25308                               QRegister(rm));
25309                          break;
25310                        }
25311                        case 0x00000800: {
25312                          // 0xef000800
25313                          switch (instr & 0x10000000) {
25314                            case 0x00000000: {
25315                              // 0xef000800
25316                              DataType dt =
25317                                  Dt_size_2_Decode((instr >> 20) & 0x3);
25318                              if (dt.Is(kDataTypeValueInvalid)) {
25319                                UnallocatedT32(instr);
25320                                return;
25321                              }
25322                              unsigned rd = ExtractDRegister(instr, 22, 12);
25323                              unsigned rn = ExtractDRegister(instr, 7, 16);
25324                              unsigned rm = ExtractDRegister(instr, 5, 0);
25325                              // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25326                              vadd(CurrentCond(),
25327                                   dt,
25328                                   DRegister(rd),
25329                                   DRegister(rn),
25330                                   DRegister(rm));
25331                              break;
25332                            }
25333                            case 0x10000000: {
25334                              // 0xff000800
25335                              DataType dt =
25336                                  Dt_size_2_Decode((instr >> 20) & 0x3);
25337                              if (dt.Is(kDataTypeValueInvalid)) {
25338                                UnallocatedT32(instr);
25339                                return;
25340                              }
25341                              unsigned rd = ExtractDRegister(instr, 22, 12);
25342                              unsigned rn = ExtractDRegister(instr, 7, 16);
25343                              unsigned rm = ExtractDRegister(instr, 5, 0);
25344                              // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25345                              vsub(CurrentCond(),
25346                                   dt,
25347                                   DRegister(rd),
25348                                   DRegister(rn),
25349                                   DRegister(rm));
25350                              break;
25351                            }
25352                          }
25353                          break;
25354                        }
25355                        case 0x00000840: {
25356                          // 0xef000840
25357                          switch (instr & 0x10000000) {
25358                            case 0x00000000: {
25359                              // 0xef000840
25360                              DataType dt =
25361                                  Dt_size_2_Decode((instr >> 20) & 0x3);
25362                              if (dt.Is(kDataTypeValueInvalid)) {
25363                                UnallocatedT32(instr);
25364                                return;
25365                              }
25366                              if (((instr >> 12) & 1) != 0) {
25367                                UnallocatedT32(instr);
25368                                return;
25369                              }
25370                              unsigned rd = ExtractQRegister(instr, 22, 12);
25371                              if (((instr >> 16) & 1) != 0) {
25372                                UnallocatedT32(instr);
25373                                return;
25374                              }
25375                              unsigned rn = ExtractQRegister(instr, 7, 16);
25376                              if ((instr & 1) != 0) {
25377                                UnallocatedT32(instr);
25378                                return;
25379                              }
25380                              unsigned rm = ExtractQRegister(instr, 5, 0);
25381                              // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25382                              vadd(CurrentCond(),
25383                                   dt,
25384                                   QRegister(rd),
25385                                   QRegister(rn),
25386                                   QRegister(rm));
25387                              break;
25388                            }
25389                            case 0x10000000: {
25390                              // 0xff000840
25391                              DataType dt =
25392                                  Dt_size_2_Decode((instr >> 20) & 0x3);
25393                              if (dt.Is(kDataTypeValueInvalid)) {
25394                                UnallocatedT32(instr);
25395                                return;
25396                              }
25397                              if (((instr >> 12) & 1) != 0) {
25398                                UnallocatedT32(instr);
25399                                return;
25400                              }
25401                              unsigned rd = ExtractQRegister(instr, 22, 12);
25402                              if (((instr >> 16) & 1) != 0) {
25403                                UnallocatedT32(instr);
25404                                return;
25405                              }
25406                              unsigned rn = ExtractQRegister(instr, 7, 16);
25407                              if ((instr & 1) != 0) {
25408                                UnallocatedT32(instr);
25409                                return;
25410                              }
25411                              unsigned rm = ExtractQRegister(instr, 5, 0);
25412                              // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25413                              vsub(CurrentCond(),
25414                                   dt,
25415                                   QRegister(rd),
25416                                   QRegister(rn),
25417                                   QRegister(rm));
25418                              break;
25419                            }
25420                          }
25421                          break;
25422                        }
25423                        case 0x00000900: {
25424                          // 0xef000900
25425                          switch (instr & 0x10000000) {
25426                            case 0x00000000: {
25427                              // 0xef000900
25428                              DataType dt =
25429                                  Dt_size_10_Decode((instr >> 20) & 0x3);
25430                              if (dt.Is(kDataTypeValueInvalid)) {
25431                                UnallocatedT32(instr);
25432                                return;
25433                              }
25434                              unsigned rd = ExtractDRegister(instr, 22, 12);
25435                              unsigned rn = ExtractDRegister(instr, 7, 16);
25436                              unsigned rm = ExtractDRegister(instr, 5, 0);
25437                              // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
25438                              vmla(CurrentCond(),
25439                                   dt,
25440                                   DRegister(rd),
25441                                   DRegister(rn),
25442                                   DRegister(rm));
25443                              break;
25444                            }
25445                            case 0x10000000: {
25446                              // 0xff000900
25447                              DataType dt =
25448                                  Dt_size_10_Decode((instr >> 20) & 0x3);
25449                              if (dt.Is(kDataTypeValueInvalid)) {
25450                                UnallocatedT32(instr);
25451                                return;
25452                              }
25453                              unsigned rd = ExtractDRegister(instr, 22, 12);
25454                              unsigned rn = ExtractDRegister(instr, 7, 16);
25455                              unsigned rm = ExtractDRegister(instr, 5, 0);
25456                              // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
25457                              vmls(CurrentCond(),
25458                                   dt,
25459                                   DRegister(rd),
25460                                   DRegister(rn),
25461                                   DRegister(rm));
25462                              break;
25463                            }
25464                          }
25465                          break;
25466                        }
25467                        case 0x00000940: {
25468                          // 0xef000940
25469                          switch (instr & 0x10000000) {
25470                            case 0x00000000: {
25471                              // 0xef000940
25472                              DataType dt =
25473                                  Dt_size_10_Decode((instr >> 20) & 0x3);
25474                              if (dt.Is(kDataTypeValueInvalid)) {
25475                                UnallocatedT32(instr);
25476                                return;
25477                              }
25478                              if (((instr >> 12) & 1) != 0) {
25479                                UnallocatedT32(instr);
25480                                return;
25481                              }
25482                              unsigned rd = ExtractQRegister(instr, 22, 12);
25483                              if (((instr >> 16) & 1) != 0) {
25484                                UnallocatedT32(instr);
25485                                return;
25486                              }
25487                              unsigned rn = ExtractQRegister(instr, 7, 16);
25488                              if ((instr & 1) != 0) {
25489                                UnallocatedT32(instr);
25490                                return;
25491                              }
25492                              unsigned rm = ExtractQRegister(instr, 5, 0);
25493                              // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
25494                              vmla(CurrentCond(),
25495                                   dt,
25496                                   QRegister(rd),
25497                                   QRegister(rn),
25498                                   QRegister(rm));
25499                              break;
25500                            }
25501                            case 0x10000000: {
25502                              // 0xff000940
25503                              DataType dt =
25504                                  Dt_size_10_Decode((instr >> 20) & 0x3);
25505                              if (dt.Is(kDataTypeValueInvalid)) {
25506                                UnallocatedT32(instr);
25507                                return;
25508                              }
25509                              if (((instr >> 12) & 1) != 0) {
25510                                UnallocatedT32(instr);
25511                                return;
25512                              }
25513                              unsigned rd = ExtractQRegister(instr, 22, 12);
25514                              if (((instr >> 16) & 1) != 0) {
25515                                UnallocatedT32(instr);
25516                                return;
25517                              }
25518                              unsigned rn = ExtractQRegister(instr, 7, 16);
25519                              if ((instr & 1) != 0) {
25520                                UnallocatedT32(instr);
25521                                return;
25522                              }
25523                              unsigned rm = ExtractQRegister(instr, 5, 0);
25524                              // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
25525                              vmls(CurrentCond(),
25526                                   dt,
25527                                   QRegister(rd),
25528                                   QRegister(rn),
25529                                   QRegister(rm));
25530                              break;
25531                            }
25532                          }
25533                          break;
25534                        }
25535                        case 0x00000a00: {
25536                          // 0xef000a00
25537                          DataType dt = Dt_U_size_1_Decode(
25538                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25539                          if (dt.Is(kDataTypeValueInvalid)) {
25540                            UnallocatedT32(instr);
25541                            return;
25542                          }
25543                          unsigned rd = ExtractDRegister(instr, 22, 12);
25544                          unsigned rn = ExtractDRegister(instr, 7, 16);
25545                          unsigned rm = ExtractDRegister(instr, 5, 0);
25546                          // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25547                          vpmax(CurrentCond(),
25548                                dt,
25549                                DRegister(rd),
25550                                DRegister(rn),
25551                                DRegister(rm));
25552                          break;
25553                        }
25554                        case 0x00000b00: {
25555                          // 0xef000b00
25556                          switch (instr & 0x10000000) {
25557                            case 0x00000000: {
25558                              // 0xef000b00
25559                              DataType dt =
25560                                  Dt_size_13_Decode((instr >> 20) & 0x3);
25561                              if (dt.Is(kDataTypeValueInvalid)) {
25562                                UnallocatedT32(instr);
25563                                return;
25564                              }
25565                              unsigned rd = ExtractDRegister(instr, 22, 12);
25566                              unsigned rn = ExtractDRegister(instr, 7, 16);
25567                              unsigned rm = ExtractDRegister(instr, 5, 0);
25568                              // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25569                              vqdmulh(CurrentCond(),
25570                                      dt,
25571                                      DRegister(rd),
25572                                      DRegister(rn),
25573                                      DRegister(rm));
25574                              break;
25575                            }
25576                            case 0x10000000: {
25577                              // 0xff000b00
25578                              DataType dt =
25579                                  Dt_size_13_Decode((instr >> 20) & 0x3);
25580                              if (dt.Is(kDataTypeValueInvalid)) {
25581                                UnallocatedT32(instr);
25582                                return;
25583                              }
25584                              unsigned rd = ExtractDRegister(instr, 22, 12);
25585                              unsigned rn = ExtractDRegister(instr, 7, 16);
25586                              unsigned rm = ExtractDRegister(instr, 5, 0);
25587                              // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25588                              vqrdmulh(CurrentCond(),
25589                                       dt,
25590                                       DRegister(rd),
25591                                       DRegister(rn),
25592                                       DRegister(rm));
25593                              break;
25594                            }
25595                          }
25596                          break;
25597                        }
25598                        case 0x00000b40: {
25599                          // 0xef000b40
25600                          switch (instr & 0x10000000) {
25601                            case 0x00000000: {
25602                              // 0xef000b40
25603                              DataType dt =
25604                                  Dt_size_13_Decode((instr >> 20) & 0x3);
25605                              if (dt.Is(kDataTypeValueInvalid)) {
25606                                UnallocatedT32(instr);
25607                                return;
25608                              }
25609                              if (((instr >> 12) & 1) != 0) {
25610                                UnallocatedT32(instr);
25611                                return;
25612                              }
25613                              unsigned rd = ExtractQRegister(instr, 22, 12);
25614                              if (((instr >> 16) & 1) != 0) {
25615                                UnallocatedT32(instr);
25616                                return;
25617                              }
25618                              unsigned rn = ExtractQRegister(instr, 7, 16);
25619                              if ((instr & 1) != 0) {
25620                                UnallocatedT32(instr);
25621                                return;
25622                              }
25623                              unsigned rm = ExtractQRegister(instr, 5, 0);
25624                              // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25625                              vqdmulh(CurrentCond(),
25626                                      dt,
25627                                      QRegister(rd),
25628                                      QRegister(rn),
25629                                      QRegister(rm));
25630                              break;
25631                            }
25632                            case 0x10000000: {
25633                              // 0xff000b40
25634                              DataType dt =
25635                                  Dt_size_13_Decode((instr >> 20) & 0x3);
25636                              if (dt.Is(kDataTypeValueInvalid)) {
25637                                UnallocatedT32(instr);
25638                                return;
25639                              }
25640                              if (((instr >> 12) & 1) != 0) {
25641                                UnallocatedT32(instr);
25642                                return;
25643                              }
25644                              unsigned rd = ExtractQRegister(instr, 22, 12);
25645                              if (((instr >> 16) & 1) != 0) {
25646                                UnallocatedT32(instr);
25647                                return;
25648                              }
25649                              unsigned rn = ExtractQRegister(instr, 7, 16);
25650                              if ((instr & 1) != 0) {
25651                                UnallocatedT32(instr);
25652                                return;
25653                              }
25654                              unsigned rm = ExtractQRegister(instr, 5, 0);
25655                              // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25656                              vqrdmulh(CurrentCond(),
25657                                       dt,
25658                                       QRegister(rd),
25659                                       QRegister(rn),
25660                                       QRegister(rm));
25661                              break;
25662                            }
25663                          }
25664                          break;
25665                        }
25666                        case 0x00000c40: {
25667                          // 0xef000c40
25668                          switch (instr & 0x10300000) {
25669                            case 0x00000000: {
25670                              // 0xef000c40
25671                              UnimplementedT32_32("SHA1C", instr);
25672                              break;
25673                            }
25674                            case 0x00100000: {
25675                              // 0xef100c40
25676                              UnimplementedT32_32("SHA1P", instr);
25677                              break;
25678                            }
25679                            case 0x00200000: {
25680                              // 0xef200c40
25681                              UnimplementedT32_32("SHA1M", instr);
25682                              break;
25683                            }
25684                            case 0x00300000: {
25685                              // 0xef300c40
25686                              UnimplementedT32_32("SHA1SU0", instr);
25687                              break;
25688                            }
25689                            case 0x10000000: {
25690                              // 0xff000c40
25691                              UnimplementedT32_32("SHA256H", instr);
25692                              break;
25693                            }
25694                            case 0x10100000: {
25695                              // 0xff100c40
25696                              UnimplementedT32_32("SHA256H2", instr);
25697                              break;
25698                            }
25699                            case 0x10200000: {
25700                              // 0xff200c40
25701                              UnimplementedT32_32("SHA256SU1", instr);
25702                              break;
25703                            }
25704                            default:
25705                              UnallocatedT32(instr);
25706                              break;
25707                          }
25708                          break;
25709                        }
25710                        case 0x00000d00: {
25711                          // 0xef000d00
25712                          switch (instr & 0x10300000) {
25713                            case 0x00000000: {
25714                              // 0xef000d00
25715                              unsigned rd = ExtractDRegister(instr, 22, 12);
25716                              unsigned rn = ExtractDRegister(instr, 7, 16);
25717                              unsigned rm = ExtractDRegister(instr, 5, 0);
25718                              // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
25719                              vadd(CurrentCond(),
25720                                   F32,
25721                                   DRegister(rd),
25722                                   DRegister(rn),
25723                                   DRegister(rm));
25724                              break;
25725                            }
25726                            case 0x00200000: {
25727                              // 0xef200d00
25728                              unsigned rd = ExtractDRegister(instr, 22, 12);
25729                              unsigned rn = ExtractDRegister(instr, 7, 16);
25730                              unsigned rm = ExtractDRegister(instr, 5, 0);
25731                              // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
25732                              vsub(CurrentCond(),
25733                                   F32,
25734                                   DRegister(rd),
25735                                   DRegister(rn),
25736                                   DRegister(rm));
25737                              break;
25738                            }
25739                            case 0x10000000: {
25740                              // 0xff000d00
25741                              unsigned rd = ExtractDRegister(instr, 22, 12);
25742                              unsigned rn = ExtractDRegister(instr, 7, 16);
25743                              unsigned rm = ExtractDRegister(instr, 5, 0);
25744                              // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
25745                              vpadd(CurrentCond(),
25746                                    F32,
25747                                    DRegister(rd),
25748                                    DRegister(rn),
25749                                    DRegister(rm));
25750                              break;
25751                            }
25752                            case 0x10200000: {
25753                              // 0xff200d00
25754                              unsigned rd = ExtractDRegister(instr, 22, 12);
25755                              unsigned rn = ExtractDRegister(instr, 7, 16);
25756                              unsigned rm = ExtractDRegister(instr, 5, 0);
25757                              // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
25758                              vabd(CurrentCond(),
25759                                   F32,
25760                                   DRegister(rd),
25761                                   DRegister(rn),
25762                                   DRegister(rm));
25763                              break;
25764                            }
25765                            default:
25766                              UnallocatedT32(instr);
25767                              break;
25768                          }
25769                          break;
25770                        }
25771                        case 0x00000d40: {
25772                          // 0xef000d40
25773                          switch (instr & 0x10300000) {
25774                            case 0x00000000: {
25775                              // 0xef000d40
25776                              if (((instr >> 12) & 1) != 0) {
25777                                UnallocatedT32(instr);
25778                                return;
25779                              }
25780                              unsigned rd = ExtractQRegister(instr, 22, 12);
25781                              if (((instr >> 16) & 1) != 0) {
25782                                UnallocatedT32(instr);
25783                                return;
25784                              }
25785                              unsigned rn = ExtractQRegister(instr, 7, 16);
25786                              if ((instr & 1) != 0) {
25787                                UnallocatedT32(instr);
25788                                return;
25789                              }
25790                              unsigned rm = ExtractQRegister(instr, 5, 0);
25791                              // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
25792                              vadd(CurrentCond(),
25793                                   F32,
25794                                   QRegister(rd),
25795                                   QRegister(rn),
25796                                   QRegister(rm));
25797                              break;
25798                            }
25799                            case 0x00200000: {
25800                              // 0xef200d40
25801                              if (((instr >> 12) & 1) != 0) {
25802                                UnallocatedT32(instr);
25803                                return;
25804                              }
25805                              unsigned rd = ExtractQRegister(instr, 22, 12);
25806                              if (((instr >> 16) & 1) != 0) {
25807                                UnallocatedT32(instr);
25808                                return;
25809                              }
25810                              unsigned rn = ExtractQRegister(instr, 7, 16);
25811                              if ((instr & 1) != 0) {
25812                                UnallocatedT32(instr);
25813                                return;
25814                              }
25815                              unsigned rm = ExtractQRegister(instr, 5, 0);
25816                              // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
25817                              vsub(CurrentCond(),
25818                                   F32,
25819                                   QRegister(rd),
25820                                   QRegister(rn),
25821                                   QRegister(rm));
25822                              break;
25823                            }
25824                            case 0x10200000: {
25825                              // 0xff200d40
25826                              if (((instr >> 12) & 1) != 0) {
25827                                UnallocatedT32(instr);
25828                                return;
25829                              }
25830                              unsigned rd = ExtractQRegister(instr, 22, 12);
25831                              if (((instr >> 16) & 1) != 0) {
25832                                UnallocatedT32(instr);
25833                                return;
25834                              }
25835                              unsigned rn = ExtractQRegister(instr, 7, 16);
25836                              if ((instr & 1) != 0) {
25837                                UnallocatedT32(instr);
25838                                return;
25839                              }
25840                              unsigned rm = ExtractQRegister(instr, 5, 0);
25841                              // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
25842                              vabd(CurrentCond(),
25843                                   F32,
25844                                   QRegister(rd),
25845                                   QRegister(rn),
25846                                   QRegister(rm));
25847                              break;
25848                            }
25849                            default:
25850                              UnallocatedT32(instr);
25851                              break;
25852                          }
25853                          break;
25854                        }
25855                        case 0x00000e00: {
25856                          // 0xef000e00
25857                          switch (instr & 0x10200000) {
25858                            case 0x00000000: {
25859                              // 0xef000e00
25860                              DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
25861                              if (dt.Is(kDataTypeValueInvalid)) {
25862                                UnallocatedT32(instr);
25863                                return;
25864                              }
25865                              unsigned rd = ExtractDRegister(instr, 22, 12);
25866                              unsigned rn = ExtractDRegister(instr, 7, 16);
25867                              unsigned rm = ExtractDRegister(instr, 5, 0);
25868                              // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T2
25869                              vceq(CurrentCond(),
25870                                   dt,
25871                                   DRegister(rd),
25872                                   DRegister(rn),
25873                                   DRegister(rm));
25874                              break;
25875                            }
25876                            case 0x10000000: {
25877                              // 0xff000e00
25878                              if ((instr & 0x00100000) == 0x00000000) {
25879                                unsigned rd = ExtractDRegister(instr, 22, 12);
25880                                unsigned rn = ExtractDRegister(instr, 7, 16);
25881                                unsigned rm = ExtractDRegister(instr, 5, 0);
25882                                // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
25883                                vcge(CurrentCond(),
25884                                     F32,
25885                                     DRegister(rd),
25886                                     DRegister(rn),
25887                                     DRegister(rm));
25888                              } else {
25889                                UnallocatedT32(instr);
25890                              }
25891                              break;
25892                            }
25893                            case 0x10200000: {
25894                              // 0xff200e00
25895                              if ((instr & 0x00100000) == 0x00000000) {
25896                                unsigned rd = ExtractDRegister(instr, 22, 12);
25897                                unsigned rn = ExtractDRegister(instr, 7, 16);
25898                                unsigned rm = ExtractDRegister(instr, 5, 0);
25899                                // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
25900                                vcgt(CurrentCond(),
25901                                     F32,
25902                                     DRegister(rd),
25903                                     DRegister(rn),
25904                                     DRegister(rm));
25905                              } else {
25906                                UnallocatedT32(instr);
25907                              }
25908                              break;
25909                            }
25910                            default:
25911                              UnallocatedT32(instr);
25912                              break;
25913                          }
25914                          break;
25915                        }
25916                        case 0x00000e40: {
25917                          // 0xef000e40
25918                          switch (instr & 0x10200000) {
25919                            case 0x00000000: {
25920                              // 0xef000e40
25921                              DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
25922                              if (dt.Is(kDataTypeValueInvalid)) {
25923                                UnallocatedT32(instr);
25924                                return;
25925                              }
25926                              if (((instr >> 12) & 1) != 0) {
25927                                UnallocatedT32(instr);
25928                                return;
25929                              }
25930                              unsigned rd = ExtractQRegister(instr, 22, 12);
25931                              if (((instr >> 16) & 1) != 0) {
25932                                UnallocatedT32(instr);
25933                                return;
25934                              }
25935                              unsigned rn = ExtractQRegister(instr, 7, 16);
25936                              if ((instr & 1) != 0) {
25937                                UnallocatedT32(instr);
25938                                return;
25939                              }
25940                              unsigned rm = ExtractQRegister(instr, 5, 0);
25941                              // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T2
25942                              vceq(CurrentCond(),
25943                                   dt,
25944                                   QRegister(rd),
25945                                   QRegister(rn),
25946                                   QRegister(rm));
25947                              break;
25948                            }
25949                            case 0x10000000: {
25950                              // 0xff000e40
25951                              if ((instr & 0x00100000) == 0x00000000) {
25952                                if (((instr >> 12) & 1) != 0) {
25953                                  UnallocatedT32(instr);
25954                                  return;
25955                                }
25956                                unsigned rd = ExtractQRegister(instr, 22, 12);
25957                                if (((instr >> 16) & 1) != 0) {
25958                                  UnallocatedT32(instr);
25959                                  return;
25960                                }
25961                                unsigned rn = ExtractQRegister(instr, 7, 16);
25962                                if ((instr & 1) != 0) {
25963                                  UnallocatedT32(instr);
25964                                  return;
25965                                }
25966                                unsigned rm = ExtractQRegister(instr, 5, 0);
25967                                // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
25968                                vcge(CurrentCond(),
25969                                     F32,
25970                                     QRegister(rd),
25971                                     QRegister(rn),
25972                                     QRegister(rm));
25973                              } else {
25974                                UnallocatedT32(instr);
25975                              }
25976                              break;
25977                            }
25978                            case 0x10200000: {
25979                              // 0xff200e40
25980                              if ((instr & 0x00100000) == 0x00000000) {
25981                                if (((instr >> 12) & 1) != 0) {
25982                                  UnallocatedT32(instr);
25983                                  return;
25984                                }
25985                                unsigned rd = ExtractQRegister(instr, 22, 12);
25986                                if (((instr >> 16) & 1) != 0) {
25987                                  UnallocatedT32(instr);
25988                                  return;
25989                                }
25990                                unsigned rn = ExtractQRegister(instr, 7, 16);
25991                                if ((instr & 1) != 0) {
25992                                  UnallocatedT32(instr);
25993                                  return;
25994                                }
25995                                unsigned rm = ExtractQRegister(instr, 5, 0);
25996                                // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
25997                                vcgt(CurrentCond(),
25998                                     F32,
25999                                     QRegister(rd),
26000                                     QRegister(rn),
26001                                     QRegister(rm));
26002                              } else {
26003                                UnallocatedT32(instr);
26004                              }
26005                              break;
26006                            }
26007                            default:
26008                              UnallocatedT32(instr);
26009                              break;
26010                          }
26011                          break;
26012                        }
26013                        case 0x00000f00: {
26014                          // 0xef000f00
26015                          switch (instr & 0x10300000) {
26016                            case 0x00000000: {
26017                              // 0xef000f00
26018                              unsigned rd = ExtractDRegister(instr, 22, 12);
26019                              unsigned rn = ExtractDRegister(instr, 7, 16);
26020                              unsigned rm = ExtractDRegister(instr, 5, 0);
26021                              // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26022                              vmax(CurrentCond(),
26023                                   F32,
26024                                   DRegister(rd),
26025                                   DRegister(rn),
26026                                   DRegister(rm));
26027                              break;
26028                            }
26029                            case 0x00200000: {
26030                              // 0xef200f00
26031                              unsigned rd = ExtractDRegister(instr, 22, 12);
26032                              unsigned rn = ExtractDRegister(instr, 7, 16);
26033                              unsigned rm = ExtractDRegister(instr, 5, 0);
26034                              // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26035                              vmin(CurrentCond(),
26036                                   F32,
26037                                   DRegister(rd),
26038                                   DRegister(rn),
26039                                   DRegister(rm));
26040                              break;
26041                            }
26042                            case 0x10000000: {
26043                              // 0xff000f00
26044                              unsigned rd = ExtractDRegister(instr, 22, 12);
26045                              unsigned rn = ExtractDRegister(instr, 7, 16);
26046                              unsigned rm = ExtractDRegister(instr, 5, 0);
26047                              // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26048                              vpmax(CurrentCond(),
26049                                    F32,
26050                                    DRegister(rd),
26051                                    DRegister(rn),
26052                                    DRegister(rm));
26053                              break;
26054                            }
26055                            case 0x10200000: {
26056                              // 0xff200f00
26057                              unsigned rd = ExtractDRegister(instr, 22, 12);
26058                              unsigned rn = ExtractDRegister(instr, 7, 16);
26059                              unsigned rm = ExtractDRegister(instr, 5, 0);
26060                              // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26061                              vpmin(CurrentCond(),
26062                                    F32,
26063                                    DRegister(rd),
26064                                    DRegister(rn),
26065                                    DRegister(rm));
26066                              break;
26067                            }
26068                            default:
26069                              UnallocatedT32(instr);
26070                              break;
26071                          }
26072                          break;
26073                        }
26074                        case 0x00000f40: {
26075                          // 0xef000f40
26076                          switch (instr & 0x10300000) {
26077                            case 0x00000000: {
26078                              // 0xef000f40
26079                              if (((instr >> 12) & 1) != 0) {
26080                                UnallocatedT32(instr);
26081                                return;
26082                              }
26083                              unsigned rd = ExtractQRegister(instr, 22, 12);
26084                              if (((instr >> 16) & 1) != 0) {
26085                                UnallocatedT32(instr);
26086                                return;
26087                              }
26088                              unsigned rn = ExtractQRegister(instr, 7, 16);
26089                              if ((instr & 1) != 0) {
26090                                UnallocatedT32(instr);
26091                                return;
26092                              }
26093                              unsigned rm = ExtractQRegister(instr, 5, 0);
26094                              // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26095                              vmax(CurrentCond(),
26096                                   F32,
26097                                   QRegister(rd),
26098                                   QRegister(rn),
26099                                   QRegister(rm));
26100                              break;
26101                            }
26102                            case 0x00200000: {
26103                              // 0xef200f40
26104                              if (((instr >> 12) & 1) != 0) {
26105                                UnallocatedT32(instr);
26106                                return;
26107                              }
26108                              unsigned rd = ExtractQRegister(instr, 22, 12);
26109                              if (((instr >> 16) & 1) != 0) {
26110                                UnallocatedT32(instr);
26111                                return;
26112                              }
26113                              unsigned rn = ExtractQRegister(instr, 7, 16);
26114                              if ((instr & 1) != 0) {
26115                                UnallocatedT32(instr);
26116                                return;
26117                              }
26118                              unsigned rm = ExtractQRegister(instr, 5, 0);
26119                              // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26120                              vmin(CurrentCond(),
26121                                   F32,
26122                                   QRegister(rd),
26123                                   QRegister(rn),
26124                                   QRegister(rm));
26125                              break;
26126                            }
26127                            default:
26128                              UnallocatedT32(instr);
26129                              break;
26130                          }
26131                          break;
26132                        }
26133                        default:
26134                          UnallocatedT32(instr);
26135                          break;
26136                      }
26137                      break;
26138                    }
26139                    case 0x00800000: {
26140                      // 0xef800000
26141                      switch (instr & 0x00300000) {
26142                        case 0x00300000: {
26143                          // 0xefb00000
26144                          switch (instr & 0x10000000) {
26145                            case 0x00000000: {
26146                              // 0xefb00000
26147                              switch (instr & 0x00000040) {
26148                                case 0x00000000: {
26149                                  // 0xefb00000
26150                                  if (((instr & 0x800) == 0x800)) {
26151                                    UnallocatedT32(instr);
26152                                    return;
26153                                  }
26154                                  unsigned rd = ExtractDRegister(instr, 22, 12);
26155                                  unsigned rn = ExtractDRegister(instr, 7, 16);
26156                                  unsigned rm = ExtractDRegister(instr, 5, 0);
26157                                  uint32_t imm = (instr >> 8) & 0xf;
26158                                  // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
26159                                  vext(CurrentCond(),
26160                                       Untyped8,
26161                                       DRegister(rd),
26162                                       DRegister(rn),
26163                                       DRegister(rm),
26164                                       imm);
26165                                  break;
26166                                }
26167                                case 0x00000040: {
26168                                  // 0xefb00040
26169                                  if (((instr >> 12) & 1) != 0) {
26170                                    UnallocatedT32(instr);
26171                                    return;
26172                                  }
26173                                  unsigned rd = ExtractQRegister(instr, 22, 12);
26174                                  if (((instr >> 16) & 1) != 0) {
26175                                    UnallocatedT32(instr);
26176                                    return;
26177                                  }
26178                                  unsigned rn = ExtractQRegister(instr, 7, 16);
26179                                  if ((instr & 1) != 0) {
26180                                    UnallocatedT32(instr);
26181                                    return;
26182                                  }
26183                                  unsigned rm = ExtractQRegister(instr, 5, 0);
26184                                  uint32_t imm = (instr >> 8) & 0xf;
26185                                  // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
26186                                  vext(CurrentCond(),
26187                                       Untyped8,
26188                                       QRegister(rd),
26189                                       QRegister(rn),
26190                                       QRegister(rm),
26191                                       imm);
26192                                  break;
26193                                }
26194                              }
26195                              break;
26196                            }
26197                            case 0x10000000: {
26198                              // 0xffb00000
26199                              switch (instr & 0x00000800) {
26200                                case 0x00000000: {
26201                                  // 0xffb00000
26202                                  switch (instr & 0x00030200) {
26203                                    case 0x00000000: {
26204                                      // 0xffb00000
26205                                      switch (instr & 0x000005c0) {
26206                                        case 0x00000000: {
26207                                          // 0xffb00000
26208                                          DataType dt = Dt_size_7_Decode(
26209                                              (instr >> 18) & 0x3);
26210                                          if (dt.Is(kDataTypeValueInvalid)) {
26211                                            UnallocatedT32(instr);
26212                                            return;
26213                                          }
26214                                          unsigned rd =
26215                                              ExtractDRegister(instr, 22, 12);
26216                                          unsigned rm =
26217                                              ExtractDRegister(instr, 5, 0);
26218                                          // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26219                                          vrev64(CurrentCond(),
26220                                                 dt,
26221                                                 DRegister(rd),
26222                                                 DRegister(rm));
26223                                          break;
26224                                        }
26225                                        case 0x00000040: {
26226                                          // 0xffb00040
26227                                          DataType dt = Dt_size_7_Decode(
26228                                              (instr >> 18) & 0x3);
26229                                          if (dt.Is(kDataTypeValueInvalid)) {
26230                                            UnallocatedT32(instr);
26231                                            return;
26232                                          }
26233                                          if (((instr >> 12) & 1) != 0) {
26234                                            UnallocatedT32(instr);
26235                                            return;
26236                                          }
26237                                          unsigned rd =
26238                                              ExtractQRegister(instr, 22, 12);
26239                                          if ((instr & 1) != 0) {
26240                                            UnallocatedT32(instr);
26241                                            return;
26242                                          }
26243                                          unsigned rm =
26244                                              ExtractQRegister(instr, 5, 0);
26245                                          // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26246                                          vrev64(CurrentCond(),
26247                                                 dt,
26248                                                 QRegister(rd),
26249                                                 QRegister(rm));
26250                                          break;
26251                                        }
26252                                        case 0x00000080: {
26253                                          // 0xffb00080
26254                                          DataType dt = Dt_size_15_Decode(
26255                                              (instr >> 18) & 0x3);
26256                                          if (dt.Is(kDataTypeValueInvalid)) {
26257                                            UnallocatedT32(instr);
26258                                            return;
26259                                          }
26260                                          unsigned rd =
26261                                              ExtractDRegister(instr, 22, 12);
26262                                          unsigned rm =
26263                                              ExtractDRegister(instr, 5, 0);
26264                                          // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26265                                          vrev32(CurrentCond(),
26266                                                 dt,
26267                                                 DRegister(rd),
26268                                                 DRegister(rm));
26269                                          break;
26270                                        }
26271                                        case 0x000000c0: {
26272                                          // 0xffb000c0
26273                                          DataType dt = Dt_size_15_Decode(
26274                                              (instr >> 18) & 0x3);
26275                                          if (dt.Is(kDataTypeValueInvalid)) {
26276                                            UnallocatedT32(instr);
26277                                            return;
26278                                          }
26279                                          if (((instr >> 12) & 1) != 0) {
26280                                            UnallocatedT32(instr);
26281                                            return;
26282                                          }
26283                                          unsigned rd =
26284                                              ExtractQRegister(instr, 22, 12);
26285                                          if ((instr & 1) != 0) {
26286                                            UnallocatedT32(instr);
26287                                            return;
26288                                          }
26289                                          unsigned rm =
26290                                              ExtractQRegister(instr, 5, 0);
26291                                          // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26292                                          vrev32(CurrentCond(),
26293                                                 dt,
26294                                                 QRegister(rd),
26295                                                 QRegister(rm));
26296                                          break;
26297                                        }
26298                                        case 0x00000100: {
26299                                          // 0xffb00100
26300                                          DataType dt = Dt_size_1_Decode(
26301                                              (instr >> 18) & 0x3);
26302                                          if (dt.Is(kDataTypeValueInvalid)) {
26303                                            UnallocatedT32(instr);
26304                                            return;
26305                                          }
26306                                          unsigned rd =
26307                                              ExtractDRegister(instr, 22, 12);
26308                                          unsigned rm =
26309                                              ExtractDRegister(instr, 5, 0);
26310                                          // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26311                                          vrev16(CurrentCond(),
26312                                                 dt,
26313                                                 DRegister(rd),
26314                                                 DRegister(rm));
26315                                          break;
26316                                        }
26317                                        case 0x00000140: {
26318                                          // 0xffb00140
26319                                          DataType dt = Dt_size_1_Decode(
26320                                              (instr >> 18) & 0x3);
26321                                          if (dt.Is(kDataTypeValueInvalid)) {
26322                                            UnallocatedT32(instr);
26323                                            return;
26324                                          }
26325                                          if (((instr >> 12) & 1) != 0) {
26326                                            UnallocatedT32(instr);
26327                                            return;
26328                                          }
26329                                          unsigned rd =
26330                                              ExtractQRegister(instr, 22, 12);
26331                                          if ((instr & 1) != 0) {
26332                                            UnallocatedT32(instr);
26333                                            return;
26334                                          }
26335                                          unsigned rm =
26336                                              ExtractQRegister(instr, 5, 0);
26337                                          // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26338                                          vrev16(CurrentCond(),
26339                                                 dt,
26340                                                 QRegister(rd),
26341                                                 QRegister(rm));
26342                                          break;
26343                                        }
26344                                        case 0x00000400: {
26345                                          // 0xffb00400
26346                                          DataType dt = Dt_size_5_Decode(
26347                                              (instr >> 18) & 0x3);
26348                                          if (dt.Is(kDataTypeValueInvalid)) {
26349                                            UnallocatedT32(instr);
26350                                            return;
26351                                          }
26352                                          unsigned rd =
26353                                              ExtractDRegister(instr, 22, 12);
26354                                          unsigned rm =
26355                                              ExtractDRegister(instr, 5, 0);
26356                                          // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
26357                                          vcls(CurrentCond(),
26358                                               dt,
26359                                               DRegister(rd),
26360                                               DRegister(rm));
26361                                          break;
26362                                        }
26363                                        case 0x00000440: {
26364                                          // 0xffb00440
26365                                          DataType dt = Dt_size_5_Decode(
26366                                              (instr >> 18) & 0x3);
26367                                          if (dt.Is(kDataTypeValueInvalid)) {
26368                                            UnallocatedT32(instr);
26369                                            return;
26370                                          }
26371                                          if (((instr >> 12) & 1) != 0) {
26372                                            UnallocatedT32(instr);
26373                                            return;
26374                                          }
26375                                          unsigned rd =
26376                                              ExtractQRegister(instr, 22, 12);
26377                                          if ((instr & 1) != 0) {
26378                                            UnallocatedT32(instr);
26379                                            return;
26380                                          }
26381                                          unsigned rm =
26382                                              ExtractQRegister(instr, 5, 0);
26383                                          // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
26384                                          vcls(CurrentCond(),
26385                                               dt,
26386                                               QRegister(rd),
26387                                               QRegister(rm));
26388                                          break;
26389                                        }
26390                                        case 0x00000480: {
26391                                          // 0xffb00480
26392                                          DataType dt = Dt_size_4_Decode(
26393                                              (instr >> 18) & 0x3);
26394                                          if (dt.Is(kDataTypeValueInvalid)) {
26395                                            UnallocatedT32(instr);
26396                                            return;
26397                                          }
26398                                          unsigned rd =
26399                                              ExtractDRegister(instr, 22, 12);
26400                                          unsigned rm =
26401                                              ExtractDRegister(instr, 5, 0);
26402                                          // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
26403                                          vclz(CurrentCond(),
26404                                               dt,
26405                                               DRegister(rd),
26406                                               DRegister(rm));
26407                                          break;
26408                                        }
26409                                        case 0x000004c0: {
26410                                          // 0xffb004c0
26411                                          DataType dt = Dt_size_4_Decode(
26412                                              (instr >> 18) & 0x3);
26413                                          if (dt.Is(kDataTypeValueInvalid)) {
26414                                            UnallocatedT32(instr);
26415                                            return;
26416                                          }
26417                                          if (((instr >> 12) & 1) != 0) {
26418                                            UnallocatedT32(instr);
26419                                            return;
26420                                          }
26421                                          unsigned rd =
26422                                              ExtractQRegister(instr, 22, 12);
26423                                          if ((instr & 1) != 0) {
26424                                            UnallocatedT32(instr);
26425                                            return;
26426                                          }
26427                                          unsigned rm =
26428                                              ExtractQRegister(instr, 5, 0);
26429                                          // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
26430                                          vclz(CurrentCond(),
26431                                               dt,
26432                                               QRegister(rd),
26433                                               QRegister(rm));
26434                                          break;
26435                                        }
26436                                        case 0x00000500: {
26437                                          // 0xffb00500
26438                                          if ((instr & 0x000c0000) ==
26439                                              0x00000000) {
26440                                            unsigned rd =
26441                                                ExtractDRegister(instr, 22, 12);
26442                                            unsigned rm =
26443                                                ExtractDRegister(instr, 5, 0);
26444                                            // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; T1
26445                                            vcnt(CurrentCond(),
26446                                                 Untyped8,
26447                                                 DRegister(rd),
26448                                                 DRegister(rm));
26449                                          } else {
26450                                            UnallocatedT32(instr);
26451                                          }
26452                                          break;
26453                                        }
26454                                        case 0x00000540: {
26455                                          // 0xffb00540
26456                                          if ((instr & 0x000c0000) ==
26457                                              0x00000000) {
26458                                            if (((instr >> 12) & 1) != 0) {
26459                                              UnallocatedT32(instr);
26460                                              return;
26461                                            }
26462                                            unsigned rd =
26463                                                ExtractQRegister(instr, 22, 12);
26464                                            if ((instr & 1) != 0) {
26465                                              UnallocatedT32(instr);
26466                                              return;
26467                                            }
26468                                            unsigned rm =
26469                                                ExtractQRegister(instr, 5, 0);
26470                                            // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; T1
26471                                            vcnt(CurrentCond(),
26472                                                 Untyped8,
26473                                                 QRegister(rd),
26474                                                 QRegister(rm));
26475                                          } else {
26476                                            UnallocatedT32(instr);
26477                                          }
26478                                          break;
26479                                        }
26480                                        case 0x00000580: {
26481                                          // 0xffb00580
26482                                          if ((instr & 0x000c0000) ==
26483                                              0x00000000) {
26484                                            unsigned rd =
26485                                                ExtractDRegister(instr, 22, 12);
26486                                            unsigned rm =
26487                                                ExtractDRegister(instr, 5, 0);
26488                                            // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26489                                            vmvn(CurrentCond(),
26490                                                 kDataTypeValueNone,
26491                                                 DRegister(rd),
26492                                                 DRegister(rm));
26493                                          } else {
26494                                            UnallocatedT32(instr);
26495                                          }
26496                                          break;
26497                                        }
26498                                        case 0x000005c0: {
26499                                          // 0xffb005c0
26500                                          if ((instr & 0x000c0000) ==
26501                                              0x00000000) {
26502                                            if (((instr >> 12) & 1) != 0) {
26503                                              UnallocatedT32(instr);
26504                                              return;
26505                                            }
26506                                            unsigned rd =
26507                                                ExtractQRegister(instr, 22, 12);
26508                                            if ((instr & 1) != 0) {
26509                                              UnallocatedT32(instr);
26510                                              return;
26511                                            }
26512                                            unsigned rm =
26513                                                ExtractQRegister(instr, 5, 0);
26514                                            // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26515                                            vmvn(CurrentCond(),
26516                                                 kDataTypeValueNone,
26517                                                 QRegister(rd),
26518                                                 QRegister(rm));
26519                                          } else {
26520                                            UnallocatedT32(instr);
26521                                          }
26522                                          break;
26523                                        }
26524                                        default:
26525                                          UnallocatedT32(instr);
26526                                          break;
26527                                      }
26528                                      break;
26529                                    }
26530                                    case 0x00000200: {
26531                                      // 0xffb00200
26532                                      switch (instr & 0x00000540) {
26533                                        case 0x00000000: {
26534                                          // 0xffb00200
26535                                          DataType dt = Dt_op_size_2_Decode(
26536                                              ((instr >> 18) & 0x3) |
26537                                              ((instr >> 5) & 0x4));
26538                                          if (dt.Is(kDataTypeValueInvalid)) {
26539                                            UnallocatedT32(instr);
26540                                            return;
26541                                          }
26542                                          unsigned rd =
26543                                              ExtractDRegister(instr, 22, 12);
26544                                          unsigned rm =
26545                                              ExtractDRegister(instr, 5, 0);
26546                                          // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26547                                          vpaddl(CurrentCond(),
26548                                                 dt,
26549                                                 DRegister(rd),
26550                                                 DRegister(rm));
26551                                          break;
26552                                        }
26553                                        case 0x00000040: {
26554                                          // 0xffb00240
26555                                          DataType dt = Dt_op_size_2_Decode(
26556                                              ((instr >> 18) & 0x3) |
26557                                              ((instr >> 5) & 0x4));
26558                                          if (dt.Is(kDataTypeValueInvalid)) {
26559                                            UnallocatedT32(instr);
26560                                            return;
26561                                          }
26562                                          if (((instr >> 12) & 1) != 0) {
26563                                            UnallocatedT32(instr);
26564                                            return;
26565                                          }
26566                                          unsigned rd =
26567                                              ExtractQRegister(instr, 22, 12);
26568                                          if ((instr & 1) != 0) {
26569                                            UnallocatedT32(instr);
26570                                            return;
26571                                          }
26572                                          unsigned rm =
26573                                              ExtractQRegister(instr, 5, 0);
26574                                          // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26575                                          vpaddl(CurrentCond(),
26576                                                 dt,
26577                                                 QRegister(rd),
26578                                                 QRegister(rm));
26579                                          break;
26580                                        }
26581                                        case 0x00000100: {
26582                                          // 0xffb00300
26583                                          switch (instr & 0x00000080) {
26584                                            case 0x00000000: {
26585                                              // 0xffb00300
26586                                              UnimplementedT32_32("AESE",
26587                                                                  instr);
26588                                              break;
26589                                            }
26590                                            case 0x00000080: {
26591                                              // 0xffb00380
26592                                              UnimplementedT32_32("AESMC",
26593                                                                  instr);
26594                                              break;
26595                                            }
26596                                          }
26597                                          break;
26598                                        }
26599                                        case 0x00000140: {
26600                                          // 0xffb00340
26601                                          switch (instr & 0x00000080) {
26602                                            case 0x00000000: {
26603                                              // 0xffb00340
26604                                              UnimplementedT32_32("AESD",
26605                                                                  instr);
26606                                              break;
26607                                            }
26608                                            case 0x00000080: {
26609                                              // 0xffb003c0
26610                                              UnimplementedT32_32("AESIMC",
26611                                                                  instr);
26612                                              break;
26613                                            }
26614                                          }
26615                                          break;
26616                                        }
26617                                        case 0x00000400: {
26618                                          // 0xffb00600
26619                                          DataType dt = Dt_op_size_2_Decode(
26620                                              ((instr >> 18) & 0x3) |
26621                                              ((instr >> 5) & 0x4));
26622                                          if (dt.Is(kDataTypeValueInvalid)) {
26623                                            UnallocatedT32(instr);
26624                                            return;
26625                                          }
26626                                          unsigned rd =
26627                                              ExtractDRegister(instr, 22, 12);
26628                                          unsigned rm =
26629                                              ExtractDRegister(instr, 5, 0);
26630                                          // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26631                                          vpadal(CurrentCond(),
26632                                                 dt,
26633                                                 DRegister(rd),
26634                                                 DRegister(rm));
26635                                          break;
26636                                        }
26637                                        case 0x00000440: {
26638                                          // 0xffb00640
26639                                          DataType dt = Dt_op_size_2_Decode(
26640                                              ((instr >> 18) & 0x3) |
26641                                              ((instr >> 5) & 0x4));
26642                                          if (dt.Is(kDataTypeValueInvalid)) {
26643                                            UnallocatedT32(instr);
26644                                            return;
26645                                          }
26646                                          if (((instr >> 12) & 1) != 0) {
26647                                            UnallocatedT32(instr);
26648                                            return;
26649                                          }
26650                                          unsigned rd =
26651                                              ExtractQRegister(instr, 22, 12);
26652                                          if ((instr & 1) != 0) {
26653                                            UnallocatedT32(instr);
26654                                            return;
26655                                          }
26656                                          unsigned rm =
26657                                              ExtractQRegister(instr, 5, 0);
26658                                          // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26659                                          vpadal(CurrentCond(),
26660                                                 dt,
26661                                                 QRegister(rd),
26662                                                 QRegister(rm));
26663                                          break;
26664                                        }
26665                                        case 0x00000500: {
26666                                          // 0xffb00700
26667                                          switch (instr & 0x00000080) {
26668                                            case 0x00000000: {
26669                                              // 0xffb00700
26670                                              DataType dt = Dt_size_5_Decode(
26671                                                  (instr >> 18) & 0x3);
26672                                              if (dt.Is(
26673                                                      kDataTypeValueInvalid)) {
26674                                                UnallocatedT32(instr);
26675                                                return;
26676                                              }
26677                                              unsigned rd =
26678                                                  ExtractDRegister(instr,
26679                                                                   22,
26680                                                                   12);
26681                                              unsigned rm =
26682                                                  ExtractDRegister(instr, 5, 0);
26683                                              // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26684                                              vqabs(CurrentCond(),
26685                                                    dt,
26686                                                    DRegister(rd),
26687                                                    DRegister(rm));
26688                                              break;
26689                                            }
26690                                            case 0x00000080: {
26691                                              // 0xffb00780
26692                                              DataType dt = Dt_size_5_Decode(
26693                                                  (instr >> 18) & 0x3);
26694                                              if (dt.Is(
26695                                                      kDataTypeValueInvalid)) {
26696                                                UnallocatedT32(instr);
26697                                                return;
26698                                              }
26699                                              unsigned rd =
26700                                                  ExtractDRegister(instr,
26701                                                                   22,
26702                                                                   12);
26703                                              unsigned rm =
26704                                                  ExtractDRegister(instr, 5, 0);
26705                                              // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26706                                              vqneg(CurrentCond(),
26707                                                    dt,
26708                                                    DRegister(rd),
26709                                                    DRegister(rm));
26710                                              break;
26711                                            }
26712                                          }
26713                                          break;
26714                                        }
26715                                        case 0x00000540: {
26716                                          // 0xffb00740
26717                                          switch (instr & 0x00000080) {
26718                                            case 0x00000000: {
26719                                              // 0xffb00740
26720                                              DataType dt = Dt_size_5_Decode(
26721                                                  (instr >> 18) & 0x3);
26722                                              if (dt.Is(
26723                                                      kDataTypeValueInvalid)) {
26724                                                UnallocatedT32(instr);
26725                                                return;
26726                                              }
26727                                              if (((instr >> 12) & 1) != 0) {
26728                                                UnallocatedT32(instr);
26729                                                return;
26730                                              }
26731                                              unsigned rd =
26732                                                  ExtractQRegister(instr,
26733                                                                   22,
26734                                                                   12);
26735                                              if ((instr & 1) != 0) {
26736                                                UnallocatedT32(instr);
26737                                                return;
26738                                              }
26739                                              unsigned rm =
26740                                                  ExtractQRegister(instr, 5, 0);
26741                                              // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26742                                              vqabs(CurrentCond(),
26743                                                    dt,
26744                                                    QRegister(rd),
26745                                                    QRegister(rm));
26746                                              break;
26747                                            }
26748                                            case 0x00000080: {
26749                                              // 0xffb007c0
26750                                              DataType dt = Dt_size_5_Decode(
26751                                                  (instr >> 18) & 0x3);
26752                                              if (dt.Is(
26753                                                      kDataTypeValueInvalid)) {
26754                                                UnallocatedT32(instr);
26755                                                return;
26756                                              }
26757                                              if (((instr >> 12) & 1) != 0) {
26758                                                UnallocatedT32(instr);
26759                                                return;
26760                                              }
26761                                              unsigned rd =
26762                                                  ExtractQRegister(instr,
26763                                                                   22,
26764                                                                   12);
26765                                              if ((instr & 1) != 0) {
26766                                                UnallocatedT32(instr);
26767                                                return;
26768                                              }
26769                                              unsigned rm =
26770                                                  ExtractQRegister(instr, 5, 0);
26771                                              // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26772                                              vqneg(CurrentCond(),
26773                                                    dt,
26774                                                    QRegister(rd),
26775                                                    QRegister(rm));
26776                                              break;
26777                                            }
26778                                          }
26779                                          break;
26780                                        }
26781                                      }
26782                                      break;
26783                                    }
26784                                    case 0x00010000: {
26785                                      // 0xffb10000
26786                                      switch (instr & 0x000001c0) {
26787                                        case 0x00000000: {
26788                                          // 0xffb10000
26789                                          DataType dt = Dt_F_size_1_Decode(
26790                                              ((instr >> 18) & 0x3) |
26791                                              ((instr >> 8) & 0x4));
26792                                          if (dt.Is(kDataTypeValueInvalid)) {
26793                                            UnallocatedT32(instr);
26794                                            return;
26795                                          }
26796                                          unsigned rd =
26797                                              ExtractDRegister(instr, 22, 12);
26798                                          unsigned rm =
26799                                              ExtractDRegister(instr, 5, 0);
26800                                          // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
26801                                          vcgt(CurrentCond(),
26802                                               dt,
26803                                               DRegister(rd),
26804                                               DRegister(rm),
26805                                               UINT32_C(0));
26806                                          break;
26807                                        }
26808                                        case 0x00000040: {
26809                                          // 0xffb10040
26810                                          DataType dt = Dt_F_size_1_Decode(
26811                                              ((instr >> 18) & 0x3) |
26812                                              ((instr >> 8) & 0x4));
26813                                          if (dt.Is(kDataTypeValueInvalid)) {
26814                                            UnallocatedT32(instr);
26815                                            return;
26816                                          }
26817                                          if (((instr >> 12) & 1) != 0) {
26818                                            UnallocatedT32(instr);
26819                                            return;
26820                                          }
26821                                          unsigned rd =
26822                                              ExtractQRegister(instr, 22, 12);
26823                                          if ((instr & 1) != 0) {
26824                                            UnallocatedT32(instr);
26825                                            return;
26826                                          }
26827                                          unsigned rm =
26828                                              ExtractQRegister(instr, 5, 0);
26829                                          // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
26830                                          vcgt(CurrentCond(),
26831                                               dt,
26832                                               QRegister(rd),
26833                                               QRegister(rm),
26834                                               UINT32_C(0));
26835                                          break;
26836                                        }
26837                                        case 0x00000080: {
26838                                          // 0xffb10080
26839                                          DataType dt = Dt_F_size_1_Decode(
26840                                              ((instr >> 18) & 0x3) |
26841                                              ((instr >> 8) & 0x4));
26842                                          if (dt.Is(kDataTypeValueInvalid)) {
26843                                            UnallocatedT32(instr);
26844                                            return;
26845                                          }
26846                                          unsigned rd =
26847                                              ExtractDRegister(instr, 22, 12);
26848                                          unsigned rm =
26849                                              ExtractDRegister(instr, 5, 0);
26850                                          // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
26851                                          vcge(CurrentCond(),
26852                                               dt,
26853                                               DRegister(rd),
26854                                               DRegister(rm),
26855                                               UINT32_C(0));
26856                                          break;
26857                                        }
26858                                        case 0x000000c0: {
26859                                          // 0xffb100c0
26860                                          DataType dt = Dt_F_size_1_Decode(
26861                                              ((instr >> 18) & 0x3) |
26862                                              ((instr >> 8) & 0x4));
26863                                          if (dt.Is(kDataTypeValueInvalid)) {
26864                                            UnallocatedT32(instr);
26865                                            return;
26866                                          }
26867                                          if (((instr >> 12) & 1) != 0) {
26868                                            UnallocatedT32(instr);
26869                                            return;
26870                                          }
26871                                          unsigned rd =
26872                                              ExtractQRegister(instr, 22, 12);
26873                                          if ((instr & 1) != 0) {
26874                                            UnallocatedT32(instr);
26875                                            return;
26876                                          }
26877                                          unsigned rm =
26878                                              ExtractQRegister(instr, 5, 0);
26879                                          // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
26880                                          vcge(CurrentCond(),
26881                                               dt,
26882                                               QRegister(rd),
26883                                               QRegister(rm),
26884                                               UINT32_C(0));
26885                                          break;
26886                                        }
26887                                        case 0x00000100: {
26888                                          // 0xffb10100
26889                                          DataType dt = Dt_F_size_2_Decode(
26890                                              ((instr >> 18) & 0x3) |
26891                                              ((instr >> 8) & 0x4));
26892                                          if (dt.Is(kDataTypeValueInvalid)) {
26893                                            UnallocatedT32(instr);
26894                                            return;
26895                                          }
26896                                          unsigned rd =
26897                                              ExtractDRegister(instr, 22, 12);
26898                                          unsigned rm =
26899                                              ExtractDRegister(instr, 5, 0);
26900                                          // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
26901                                          vceq(CurrentCond(),
26902                                               dt,
26903                                               DRegister(rd),
26904                                               DRegister(rm),
26905                                               UINT32_C(0));
26906                                          break;
26907                                        }
26908                                        case 0x00000140: {
26909                                          // 0xffb10140
26910                                          DataType dt = Dt_F_size_2_Decode(
26911                                              ((instr >> 18) & 0x3) |
26912                                              ((instr >> 8) & 0x4));
26913                                          if (dt.Is(kDataTypeValueInvalid)) {
26914                                            UnallocatedT32(instr);
26915                                            return;
26916                                          }
26917                                          if (((instr >> 12) & 1) != 0) {
26918                                            UnallocatedT32(instr);
26919                                            return;
26920                                          }
26921                                          unsigned rd =
26922                                              ExtractQRegister(instr, 22, 12);
26923                                          if ((instr & 1) != 0) {
26924                                            UnallocatedT32(instr);
26925                                            return;
26926                                          }
26927                                          unsigned rm =
26928                                              ExtractQRegister(instr, 5, 0);
26929                                          // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
26930                                          vceq(CurrentCond(),
26931                                               dt,
26932                                               QRegister(rd),
26933                                               QRegister(rm),
26934                                               UINT32_C(0));
26935                                          break;
26936                                        }
26937                                        case 0x00000180: {
26938                                          // 0xffb10180
26939                                          DataType dt = Dt_F_size_1_Decode(
26940                                              ((instr >> 18) & 0x3) |
26941                                              ((instr >> 8) & 0x4));
26942                                          if (dt.Is(kDataTypeValueInvalid)) {
26943                                            UnallocatedT32(instr);
26944                                            return;
26945                                          }
26946                                          unsigned rd =
26947                                              ExtractDRegister(instr, 22, 12);
26948                                          unsigned rm =
26949                                              ExtractDRegister(instr, 5, 0);
26950                                          // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
26951                                          vcle(CurrentCond(),
26952                                               dt,
26953                                               DRegister(rd),
26954                                               DRegister(rm),
26955                                               UINT32_C(0));
26956                                          break;
26957                                        }
26958                                        case 0x000001c0: {
26959                                          // 0xffb101c0
26960                                          DataType dt = Dt_F_size_1_Decode(
26961                                              ((instr >> 18) & 0x3) |
26962                                              ((instr >> 8) & 0x4));
26963                                          if (dt.Is(kDataTypeValueInvalid)) {
26964                                            UnallocatedT32(instr);
26965                                            return;
26966                                          }
26967                                          if (((instr >> 12) & 1) != 0) {
26968                                            UnallocatedT32(instr);
26969                                            return;
26970                                          }
26971                                          unsigned rd =
26972                                              ExtractQRegister(instr, 22, 12);
26973                                          if ((instr & 1) != 0) {
26974                                            UnallocatedT32(instr);
26975                                            return;
26976                                          }
26977                                          unsigned rm =
26978                                              ExtractQRegister(instr, 5, 0);
26979                                          // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
26980                                          vcle(CurrentCond(),
26981                                               dt,
26982                                               QRegister(rd),
26983                                               QRegister(rm),
26984                                               UINT32_C(0));
26985                                          break;
26986                                        }
26987                                      }
26988                                      break;
26989                                    }
26990                                    case 0x00010200: {
26991                                      // 0xffb10200
26992                                      switch (instr & 0x000001c0) {
26993                                        case 0x00000000: {
26994                                          // 0xffb10200
26995                                          DataType dt = Dt_F_size_1_Decode(
26996                                              ((instr >> 18) & 0x3) |
26997                                              ((instr >> 8) & 0x4));
26998                                          if (dt.Is(kDataTypeValueInvalid)) {
26999                                            UnallocatedT32(instr);
27000                                            return;
27001                                          }
27002                                          unsigned rd =
27003                                              ExtractDRegister(instr, 22, 12);
27004                                          unsigned rm =
27005                                              ExtractDRegister(instr, 5, 0);
27006                                          // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27007                                          vclt(CurrentCond(),
27008                                               dt,
27009                                               DRegister(rd),
27010                                               DRegister(rm),
27011                                               UINT32_C(0));
27012                                          break;
27013                                        }
27014                                        case 0x00000040: {
27015                                          // 0xffb10240
27016                                          DataType dt = Dt_F_size_1_Decode(
27017                                              ((instr >> 18) & 0x3) |
27018                                              ((instr >> 8) & 0x4));
27019                                          if (dt.Is(kDataTypeValueInvalid)) {
27020                                            UnallocatedT32(instr);
27021                                            return;
27022                                          }
27023                                          if (((instr >> 12) & 1) != 0) {
27024                                            UnallocatedT32(instr);
27025                                            return;
27026                                          }
27027                                          unsigned rd =
27028                                              ExtractQRegister(instr, 22, 12);
27029                                          if ((instr & 1) != 0) {
27030                                            UnallocatedT32(instr);
27031                                            return;
27032                                          }
27033                                          unsigned rm =
27034                                              ExtractQRegister(instr, 5, 0);
27035                                          // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27036                                          vclt(CurrentCond(),
27037                                               dt,
27038                                               QRegister(rd),
27039                                               QRegister(rm),
27040                                               UINT32_C(0));
27041                                          break;
27042                                        }
27043                                        case 0x000000c0: {
27044                                          // 0xffb102c0
27045                                          if ((instr & 0x000c0400) ==
27046                                              0x00080000) {
27047                                            UnimplementedT32_32("SHA1H", instr);
27048                                          } else {
27049                                            UnallocatedT32(instr);
27050                                          }
27051                                          break;
27052                                        }
27053                                        case 0x00000100: {
27054                                          // 0xffb10300
27055                                          DataType dt = Dt_F_size_1_Decode(
27056                                              ((instr >> 18) & 0x3) |
27057                                              ((instr >> 8) & 0x4));
27058                                          if (dt.Is(kDataTypeValueInvalid)) {
27059                                            UnallocatedT32(instr);
27060                                            return;
27061                                          }
27062                                          unsigned rd =
27063                                              ExtractDRegister(instr, 22, 12);
27064                                          unsigned rm =
27065                                              ExtractDRegister(instr, 5, 0);
27066                                          // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27067                                          vabs(CurrentCond(),
27068                                               dt,
27069                                               DRegister(rd),
27070                                               DRegister(rm));
27071                                          break;
27072                                        }
27073                                        case 0x00000140: {
27074                                          // 0xffb10340
27075                                          DataType dt = Dt_F_size_1_Decode(
27076                                              ((instr >> 18) & 0x3) |
27077                                              ((instr >> 8) & 0x4));
27078                                          if (dt.Is(kDataTypeValueInvalid)) {
27079                                            UnallocatedT32(instr);
27080                                            return;
27081                                          }
27082                                          if (((instr >> 12) & 1) != 0) {
27083                                            UnallocatedT32(instr);
27084                                            return;
27085                                          }
27086                                          unsigned rd =
27087                                              ExtractQRegister(instr, 22, 12);
27088                                          if ((instr & 1) != 0) {
27089                                            UnallocatedT32(instr);
27090                                            return;
27091                                          }
27092                                          unsigned rm =
27093                                              ExtractQRegister(instr, 5, 0);
27094                                          // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27095                                          vabs(CurrentCond(),
27096                                               dt,
27097                                               QRegister(rd),
27098                                               QRegister(rm));
27099                                          break;
27100                                        }
27101                                        case 0x00000180: {
27102                                          // 0xffb10380
27103                                          DataType dt = Dt_F_size_1_Decode(
27104                                              ((instr >> 18) & 0x3) |
27105                                              ((instr >> 8) & 0x4));
27106                                          if (dt.Is(kDataTypeValueInvalid)) {
27107                                            UnallocatedT32(instr);
27108                                            return;
27109                                          }
27110                                          unsigned rd =
27111                                              ExtractDRegister(instr, 22, 12);
27112                                          unsigned rm =
27113                                              ExtractDRegister(instr, 5, 0);
27114                                          // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27115                                          vneg(CurrentCond(),
27116                                               dt,
27117                                               DRegister(rd),
27118                                               DRegister(rm));
27119                                          break;
27120                                        }
27121                                        case 0x000001c0: {
27122                                          // 0xffb103c0
27123                                          DataType dt = Dt_F_size_1_Decode(
27124                                              ((instr >> 18) & 0x3) |
27125                                              ((instr >> 8) & 0x4));
27126                                          if (dt.Is(kDataTypeValueInvalid)) {
27127                                            UnallocatedT32(instr);
27128                                            return;
27129                                          }
27130                                          if (((instr >> 12) & 1) != 0) {
27131                                            UnallocatedT32(instr);
27132                                            return;
27133                                          }
27134                                          unsigned rd =
27135                                              ExtractQRegister(instr, 22, 12);
27136                                          if ((instr & 1) != 0) {
27137                                            UnallocatedT32(instr);
27138                                            return;
27139                                          }
27140                                          unsigned rm =
27141                                              ExtractQRegister(instr, 5, 0);
27142                                          // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27143                                          vneg(CurrentCond(),
27144                                               dt,
27145                                               QRegister(rd),
27146                                               QRegister(rm));
27147                                          break;
27148                                        }
27149                                        default:
27150                                          UnallocatedT32(instr);
27151                                          break;
27152                                      }
27153                                      break;
27154                                    }
27155                                    case 0x00020000: {
27156                                      // 0xffb20000
27157                                      switch (instr & 0x000005c0) {
27158                                        case 0x00000000: {
27159                                          // 0xffb20000
27160                                          if ((instr & 0x000c0000) ==
27161                                              0x00000000) {
27162                                            unsigned rd =
27163                                                ExtractDRegister(instr, 22, 12);
27164                                            unsigned rm =
27165                                                ExtractDRegister(instr, 5, 0);
27166                                            // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27167                                            vswp(CurrentCond(),
27168                                                 kDataTypeValueNone,
27169                                                 DRegister(rd),
27170                                                 DRegister(rm));
27171                                          } else {
27172                                            UnallocatedT32(instr);
27173                                          }
27174                                          break;
27175                                        }
27176                                        case 0x00000040: {
27177                                          // 0xffb20040
27178                                          if ((instr & 0x000c0000) ==
27179                                              0x00000000) {
27180                                            if (((instr >> 12) & 1) != 0) {
27181                                              UnallocatedT32(instr);
27182                                              return;
27183                                            }
27184                                            unsigned rd =
27185                                                ExtractQRegister(instr, 22, 12);
27186                                            if ((instr & 1) != 0) {
27187                                              UnallocatedT32(instr);
27188                                              return;
27189                                            }
27190                                            unsigned rm =
27191                                                ExtractQRegister(instr, 5, 0);
27192                                            // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27193                                            vswp(CurrentCond(),
27194                                                 kDataTypeValueNone,
27195                                                 QRegister(rd),
27196                                                 QRegister(rm));
27197                                          } else {
27198                                            UnallocatedT32(instr);
27199                                          }
27200                                          break;
27201                                        }
27202                                        case 0x00000080: {
27203                                          // 0xffb20080
27204                                          DataType dt = Dt_size_7_Decode(
27205                                              (instr >> 18) & 0x3);
27206                                          if (dt.Is(kDataTypeValueInvalid)) {
27207                                            UnallocatedT32(instr);
27208                                            return;
27209                                          }
27210                                          unsigned rd =
27211                                              ExtractDRegister(instr, 22, 12);
27212                                          unsigned rm =
27213                                              ExtractDRegister(instr, 5, 0);
27214                                          // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27215                                          vtrn(CurrentCond(),
27216                                               dt,
27217                                               DRegister(rd),
27218                                               DRegister(rm));
27219                                          break;
27220                                        }
27221                                        case 0x000000c0: {
27222                                          // 0xffb200c0
27223                                          DataType dt = Dt_size_7_Decode(
27224                                              (instr >> 18) & 0x3);
27225                                          if (dt.Is(kDataTypeValueInvalid)) {
27226                                            UnallocatedT32(instr);
27227                                            return;
27228                                          }
27229                                          if (((instr >> 12) & 1) != 0) {
27230                                            UnallocatedT32(instr);
27231                                            return;
27232                                          }
27233                                          unsigned rd =
27234                                              ExtractQRegister(instr, 22, 12);
27235                                          if ((instr & 1) != 0) {
27236                                            UnallocatedT32(instr);
27237                                            return;
27238                                          }
27239                                          unsigned rm =
27240                                              ExtractQRegister(instr, 5, 0);
27241                                          // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27242                                          vtrn(CurrentCond(),
27243                                               dt,
27244                                               QRegister(rd),
27245                                               QRegister(rm));
27246                                          break;
27247                                        }
27248                                        case 0x00000100: {
27249                                          // 0xffb20100
27250                                          DataType dt = Dt_size_15_Decode(
27251                                              (instr >> 18) & 0x3);
27252                                          if (dt.Is(kDataTypeValueInvalid)) {
27253                                            UnallocatedT32(instr);
27254                                            return;
27255                                          }
27256                                          unsigned rd =
27257                                              ExtractDRegister(instr, 22, 12);
27258                                          unsigned rm =
27259                                              ExtractDRegister(instr, 5, 0);
27260                                          // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27261                                          vuzp(CurrentCond(),
27262                                               dt,
27263                                               DRegister(rd),
27264                                               DRegister(rm));
27265                                          break;
27266                                        }
27267                                        case 0x00000140: {
27268                                          // 0xffb20140
27269                                          DataType dt = Dt_size_7_Decode(
27270                                              (instr >> 18) & 0x3);
27271                                          if (dt.Is(kDataTypeValueInvalid)) {
27272                                            UnallocatedT32(instr);
27273                                            return;
27274                                          }
27275                                          if (((instr >> 12) & 1) != 0) {
27276                                            UnallocatedT32(instr);
27277                                            return;
27278                                          }
27279                                          unsigned rd =
27280                                              ExtractQRegister(instr, 22, 12);
27281                                          if ((instr & 1) != 0) {
27282                                            UnallocatedT32(instr);
27283                                            return;
27284                                          }
27285                                          unsigned rm =
27286                                              ExtractQRegister(instr, 5, 0);
27287                                          // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27288                                          vuzp(CurrentCond(),
27289                                               dt,
27290                                               QRegister(rd),
27291                                               QRegister(rm));
27292                                          break;
27293                                        }
27294                                        case 0x00000180: {
27295                                          // 0xffb20180
27296                                          DataType dt = Dt_size_15_Decode(
27297                                              (instr >> 18) & 0x3);
27298                                          if (dt.Is(kDataTypeValueInvalid)) {
27299                                            UnallocatedT32(instr);
27300                                            return;
27301                                          }
27302                                          unsigned rd =
27303                                              ExtractDRegister(instr, 22, 12);
27304                                          unsigned rm =
27305                                              ExtractDRegister(instr, 5, 0);
27306                                          // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27307                                          vzip(CurrentCond(),
27308                                               dt,
27309                                               DRegister(rd),
27310                                               DRegister(rm));
27311                                          break;
27312                                        }
27313                                        case 0x000001c0: {
27314                                          // 0xffb201c0
27315                                          DataType dt = Dt_size_7_Decode(
27316                                              (instr >> 18) & 0x3);
27317                                          if (dt.Is(kDataTypeValueInvalid)) {
27318                                            UnallocatedT32(instr);
27319                                            return;
27320                                          }
27321                                          if (((instr >> 12) & 1) != 0) {
27322                                            UnallocatedT32(instr);
27323                                            return;
27324                                          }
27325                                          unsigned rd =
27326                                              ExtractQRegister(instr, 22, 12);
27327                                          if ((instr & 1) != 0) {
27328                                            UnallocatedT32(instr);
27329                                            return;
27330                                          }
27331                                          unsigned rm =
27332                                              ExtractQRegister(instr, 5, 0);
27333                                          // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27334                                          vzip(CurrentCond(),
27335                                               dt,
27336                                               QRegister(rd),
27337                                               QRegister(rm));
27338                                          break;
27339                                        }
27340                                        case 0x00000400: {
27341                                          // 0xffb20400
27342                                          DataType dt = Dt_size_16_Decode(
27343                                              (instr >> 18) & 0x3);
27344                                          if (dt.Is(kDataTypeValueInvalid)) {
27345                                            UnallocatedT32(instr);
27346                                            return;
27347                                          }
27348                                          unsigned rd =
27349                                              ExtractDRegister(instr, 22, 12);
27350                                          unsigned rm =
27351                                              ExtractDRegister(instr, 5, 0);
27352                                          // VRINTN{<q>}.<dt> <Dd>, <Dm> ; T1
27353                                          vrintn(dt,
27354                                                 DRegister(rd),
27355                                                 DRegister(rm));
27356                                          break;
27357                                        }
27358                                        case 0x00000440: {
27359                                          // 0xffb20440
27360                                          DataType dt = Dt_size_16_Decode(
27361                                              (instr >> 18) & 0x3);
27362                                          if (dt.Is(kDataTypeValueInvalid)) {
27363                                            UnallocatedT32(instr);
27364                                            return;
27365                                          }
27366                                          if (((instr >> 12) & 1) != 0) {
27367                                            UnallocatedT32(instr);
27368                                            return;
27369                                          }
27370                                          unsigned rd =
27371                                              ExtractQRegister(instr, 22, 12);
27372                                          if ((instr & 1) != 0) {
27373                                            UnallocatedT32(instr);
27374                                            return;
27375                                          }
27376                                          unsigned rm =
27377                                              ExtractQRegister(instr, 5, 0);
27378                                          // VRINTN{<q>}.<dt> <Qd>, <Qm> ; T1
27379                                          vrintn(dt,
27380                                                 QRegister(rd),
27381                                                 QRegister(rm));
27382                                          break;
27383                                        }
27384                                        case 0x00000480: {
27385                                          // 0xffb20480
27386                                          DataType dt = Dt_size_16_Decode(
27387                                              (instr >> 18) & 0x3);
27388                                          if (dt.Is(kDataTypeValueInvalid)) {
27389                                            UnallocatedT32(instr);
27390                                            return;
27391                                          }
27392                                          unsigned rd =
27393                                              ExtractDRegister(instr, 22, 12);
27394                                          unsigned rm =
27395                                              ExtractDRegister(instr, 5, 0);
27396                                          // VRINTX{<q>}.<dt> <Dd>, <Dm> ; T1
27397                                          vrintx(Condition::None(),
27398                                                 dt,
27399                                                 DRegister(rd),
27400                                                 DRegister(rm));
27401                                          break;
27402                                        }
27403                                        case 0x000004c0: {
27404                                          // 0xffb204c0
27405                                          DataType dt = Dt_size_16_Decode(
27406                                              (instr >> 18) & 0x3);
27407                                          if (dt.Is(kDataTypeValueInvalid)) {
27408                                            UnallocatedT32(instr);
27409                                            return;
27410                                          }
27411                                          if (((instr >> 12) & 1) != 0) {
27412                                            UnallocatedT32(instr);
27413                                            return;
27414                                          }
27415                                          unsigned rd =
27416                                              ExtractQRegister(instr, 22, 12);
27417                                          if ((instr & 1) != 0) {
27418                                            UnallocatedT32(instr);
27419                                            return;
27420                                          }
27421                                          unsigned rm =
27422                                              ExtractQRegister(instr, 5, 0);
27423                                          // VRINTX{<q>}.<dt> <Qd>, <Qm> ; T1
27424                                          vrintx(dt,
27425                                                 QRegister(rd),
27426                                                 QRegister(rm));
27427                                          break;
27428                                        }
27429                                        case 0x00000500: {
27430                                          // 0xffb20500
27431                                          DataType dt = Dt_size_16_Decode(
27432                                              (instr >> 18) & 0x3);
27433                                          if (dt.Is(kDataTypeValueInvalid)) {
27434                                            UnallocatedT32(instr);
27435                                            return;
27436                                          }
27437                                          unsigned rd =
27438                                              ExtractDRegister(instr, 22, 12);
27439                                          unsigned rm =
27440                                              ExtractDRegister(instr, 5, 0);
27441                                          // VRINTA{<q>}.<dt> <Dd>, <Dm> ; T1
27442                                          vrinta(dt,
27443                                                 DRegister(rd),
27444                                                 DRegister(rm));
27445                                          break;
27446                                        }
27447                                        case 0x00000540: {
27448                                          // 0xffb20540
27449                                          DataType dt = Dt_size_16_Decode(
27450                                              (instr >> 18) & 0x3);
27451                                          if (dt.Is(kDataTypeValueInvalid)) {
27452                                            UnallocatedT32(instr);
27453                                            return;
27454                                          }
27455                                          if (((instr >> 12) & 1) != 0) {
27456                                            UnallocatedT32(instr);
27457                                            return;
27458                                          }
27459                                          unsigned rd =
27460                                              ExtractQRegister(instr, 22, 12);
27461                                          if ((instr & 1) != 0) {
27462                                            UnallocatedT32(instr);
27463                                            return;
27464                                          }
27465                                          unsigned rm =
27466                                              ExtractQRegister(instr, 5, 0);
27467                                          // VRINTA{<q>}.<dt> <Qd>, <Qm> ; T1
27468                                          vrinta(dt,
27469                                                 QRegister(rd),
27470                                                 QRegister(rm));
27471                                          break;
27472                                        }
27473                                        case 0x00000580: {
27474                                          // 0xffb20580
27475                                          DataType dt = Dt_size_16_Decode(
27476                                              (instr >> 18) & 0x3);
27477                                          if (dt.Is(kDataTypeValueInvalid)) {
27478                                            UnallocatedT32(instr);
27479                                            return;
27480                                          }
27481                                          unsigned rd =
27482                                              ExtractDRegister(instr, 22, 12);
27483                                          unsigned rm =
27484                                              ExtractDRegister(instr, 5, 0);
27485                                          // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; T1
27486                                          vrintz(Condition::None(),
27487                                                 dt,
27488                                                 DRegister(rd),
27489                                                 DRegister(rm));
27490                                          break;
27491                                        }
27492                                        case 0x000005c0: {
27493                                          // 0xffb205c0
27494                                          DataType dt = Dt_size_16_Decode(
27495                                              (instr >> 18) & 0x3);
27496                                          if (dt.Is(kDataTypeValueInvalid)) {
27497                                            UnallocatedT32(instr);
27498                                            return;
27499                                          }
27500                                          if (((instr >> 12) & 1) != 0) {
27501                                            UnallocatedT32(instr);
27502                                            return;
27503                                          }
27504                                          unsigned rd =
27505                                              ExtractQRegister(instr, 22, 12);
27506                                          if ((instr & 1) != 0) {
27507                                            UnallocatedT32(instr);
27508                                            return;
27509                                          }
27510                                          unsigned rm =
27511                                              ExtractQRegister(instr, 5, 0);
27512                                          // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; T1
27513                                          vrintz(dt,
27514                                                 QRegister(rd),
27515                                                 QRegister(rm));
27516                                          break;
27517                                        }
27518                                      }
27519                                      break;
27520                                    }
27521                                    case 0x00020200: {
27522                                      // 0xffb20200
27523                                      switch (instr & 0x00000580) {
27524                                        case 0x00000000: {
27525                                          // 0xffb20200
27526                                          switch (instr & 0x00000040) {
27527                                            case 0x00000000: {
27528                                              // 0xffb20200
27529                                              DataType dt = Dt_size_3_Decode(
27530                                                  (instr >> 18) & 0x3);
27531                                              if (dt.Is(
27532                                                      kDataTypeValueInvalid)) {
27533                                                UnallocatedT32(instr);
27534                                                return;
27535                                              }
27536                                              unsigned rd =
27537                                                  ExtractDRegister(instr,
27538                                                                   22,
27539                                                                   12);
27540                                              if ((instr & 1) != 0) {
27541                                                UnallocatedT32(instr);
27542                                                return;
27543                                              }
27544                                              unsigned rm =
27545                                                  ExtractQRegister(instr, 5, 0);
27546                                              // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27547                                              vmovn(CurrentCond(),
27548                                                    dt,
27549                                                    DRegister(rd),
27550                                                    QRegister(rm));
27551                                              break;
27552                                            }
27553                                            case 0x00000040: {
27554                                              // 0xffb20240
27555                                              DataType dt = Dt_size_14_Decode(
27556                                                  (instr >> 18) & 0x3);
27557                                              if (dt.Is(
27558                                                      kDataTypeValueInvalid)) {
27559                                                UnallocatedT32(instr);
27560                                                return;
27561                                              }
27562                                              unsigned rd =
27563                                                  ExtractDRegister(instr,
27564                                                                   22,
27565                                                                   12);
27566                                              if ((instr & 1) != 0) {
27567                                                UnallocatedT32(instr);
27568                                                return;
27569                                              }
27570                                              unsigned rm =
27571                                                  ExtractQRegister(instr, 5, 0);
27572                                              // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27573                                              vqmovun(CurrentCond(),
27574                                                      dt,
27575                                                      DRegister(rd),
27576                                                      QRegister(rm));
27577                                              break;
27578                                            }
27579                                          }
27580                                          break;
27581                                        }
27582                                        case 0x00000080: {
27583                                          // 0xffb20280
27584                                          DataType dt = Dt_op_size_3_Decode(
27585                                              ((instr >> 18) & 0x3) |
27586                                              ((instr >> 4) & 0x4));
27587                                          if (dt.Is(kDataTypeValueInvalid)) {
27588                                            UnallocatedT32(instr);
27589                                            return;
27590                                          }
27591                                          unsigned rd =
27592                                              ExtractDRegister(instr, 22, 12);
27593                                          if ((instr & 1) != 0) {
27594                                            UnallocatedT32(instr);
27595                                            return;
27596                                          }
27597                                          unsigned rm =
27598                                              ExtractQRegister(instr, 5, 0);
27599                                          // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27600                                          vqmovn(CurrentCond(),
27601                                                 dt,
27602                                                 DRegister(rd),
27603                                                 QRegister(rm));
27604                                          break;
27605                                        }
27606                                        case 0x00000100: {
27607                                          // 0xffb20300
27608                                          if ((instr & 0x00000040) ==
27609                                              0x00000000) {
27610                                            DataType dt = Dt_size_17_Decode(
27611                                                (instr >> 18) & 0x3);
27612                                            if (dt.Is(kDataTypeValueInvalid)) {
27613                                              UnallocatedT32(instr);
27614                                              return;
27615                                            }
27616                                            if (((instr >> 12) & 1) != 0) {
27617                                              UnallocatedT32(instr);
27618                                              return;
27619                                            }
27620                                            unsigned rd =
27621                                                ExtractQRegister(instr, 22, 12);
27622                                            unsigned rm =
27623                                                ExtractDRegister(instr, 5, 0);
27624                                            uint32_t imm = dt.GetSize();
27625                                            // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T2 NOLINT(whitespace/line_length)
27626                                            vshll(CurrentCond(),
27627                                                  dt,
27628                                                  QRegister(rd),
27629                                                  DRegister(rm),
27630                                                  imm);
27631                                          } else {
27632                                            UnallocatedT32(instr);
27633                                          }
27634                                          break;
27635                                        }
27636                                        case 0x00000180: {
27637                                          // 0xffb20380
27638                                          switch (instr & 0x000c0040) {
27639                                            case 0x00080000: {
27640                                              // 0xffba0380
27641                                              UnimplementedT32_32("SHA1SU1",
27642                                                                  instr);
27643                                              break;
27644                                            }
27645                                            case 0x00080040: {
27646                                              // 0xffba03c0
27647                                              UnimplementedT32_32("SHA256SU0",
27648                                                                  instr);
27649                                              break;
27650                                            }
27651                                            default:
27652                                              UnallocatedT32(instr);
27653                                              break;
27654                                          }
27655                                          break;
27656                                        }
27657                                        case 0x00000400: {
27658                                          // 0xffb20600
27659                                          if ((instr & 0x000c0040) ==
27660                                              0x00040000) {
27661                                            unsigned rd =
27662                                                ExtractDRegister(instr, 22, 12);
27663                                            if ((instr & 1) != 0) {
27664                                              UnallocatedT32(instr);
27665                                              return;
27666                                            }
27667                                            unsigned rm =
27668                                                ExtractQRegister(instr, 5, 0);
27669                                            // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27670                                            vcvt(CurrentCond(),
27671                                                 F16,
27672                                                 F32,
27673                                                 DRegister(rd),
27674                                                 QRegister(rm));
27675                                          } else {
27676                                            UnallocatedT32(instr);
27677                                          }
27678                                          break;
27679                                        }
27680                                        case 0x00000480: {
27681                                          // 0xffb20680
27682                                          switch (instr & 0x00000040) {
27683                                            case 0x00000000: {
27684                                              // 0xffb20680
27685                                              DataType dt = Dt_size_16_Decode(
27686                                                  (instr >> 18) & 0x3);
27687                                              if (dt.Is(
27688                                                      kDataTypeValueInvalid)) {
27689                                                UnallocatedT32(instr);
27690                                                return;
27691                                              }
27692                                              unsigned rd =
27693                                                  ExtractDRegister(instr,
27694                                                                   22,
27695                                                                   12);
27696                                              unsigned rm =
27697                                                  ExtractDRegister(instr, 5, 0);
27698                                              // VRINTM{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27699                                              vrintm(dt,
27700                                                     DRegister(rd),
27701                                                     DRegister(rm));
27702                                              break;
27703                                            }
27704                                            case 0x00000040: {
27705                                              // 0xffb206c0
27706                                              DataType dt = Dt_size_16_Decode(
27707                                                  (instr >> 18) & 0x3);
27708                                              if (dt.Is(
27709                                                      kDataTypeValueInvalid)) {
27710                                                UnallocatedT32(instr);
27711                                                return;
27712                                              }
27713                                              if (((instr >> 12) & 1) != 0) {
27714                                                UnallocatedT32(instr);
27715                                                return;
27716                                              }
27717                                              unsigned rd =
27718                                                  ExtractQRegister(instr,
27719                                                                   22,
27720                                                                   12);
27721                                              if ((instr & 1) != 0) {
27722                                                UnallocatedT32(instr);
27723                                                return;
27724                                              }
27725                                              unsigned rm =
27726                                                  ExtractQRegister(instr, 5, 0);
27727                                              // VRINTM{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27728                                              vrintm(dt,
27729                                                     QRegister(rd),
27730                                                     QRegister(rm));
27731                                              break;
27732                                            }
27733                                          }
27734                                          break;
27735                                        }
27736                                        case 0x00000500: {
27737                                          // 0xffb20700
27738                                          if ((instr & 0x000c0040) ==
27739                                              0x00040000) {
27740                                            if (((instr >> 12) & 1) != 0) {
27741                                              UnallocatedT32(instr);
27742                                              return;
27743                                            }
27744                                            unsigned rd =
27745                                                ExtractQRegister(instr, 22, 12);
27746                                            unsigned rm =
27747                                                ExtractDRegister(instr, 5, 0);
27748                                            // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27749                                            vcvt(CurrentCond(),
27750                                                 F32,
27751                                                 F16,
27752                                                 QRegister(rd),
27753                                                 DRegister(rm));
27754                                          } else {
27755                                            UnallocatedT32(instr);
27756                                          }
27757                                          break;
27758                                        }
27759                                        case 0x00000580: {
27760                                          // 0xffb20780
27761                                          switch (instr & 0x00000040) {
27762                                            case 0x00000000: {
27763                                              // 0xffb20780
27764                                              DataType dt = Dt_size_16_Decode(
27765                                                  (instr >> 18) & 0x3);
27766                                              if (dt.Is(
27767                                                      kDataTypeValueInvalid)) {
27768                                                UnallocatedT32(instr);
27769                                                return;
27770                                              }
27771                                              unsigned rd =
27772                                                  ExtractDRegister(instr,
27773                                                                   22,
27774                                                                   12);
27775                                              unsigned rm =
27776                                                  ExtractDRegister(instr, 5, 0);
27777                                              // VRINTP{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27778                                              vrintp(dt,
27779                                                     DRegister(rd),
27780                                                     DRegister(rm));
27781                                              break;
27782                                            }
27783                                            case 0x00000040: {
27784                                              // 0xffb207c0
27785                                              DataType dt = Dt_size_16_Decode(
27786                                                  (instr >> 18) & 0x3);
27787                                              if (dt.Is(
27788                                                      kDataTypeValueInvalid)) {
27789                                                UnallocatedT32(instr);
27790                                                return;
27791                                              }
27792                                              if (((instr >> 12) & 1) != 0) {
27793                                                UnallocatedT32(instr);
27794                                                return;
27795                                              }
27796                                              unsigned rd =
27797                                                  ExtractQRegister(instr,
27798                                                                   22,
27799                                                                   12);
27800                                              if ((instr & 1) != 0) {
27801                                                UnallocatedT32(instr);
27802                                                return;
27803                                              }
27804                                              unsigned rm =
27805                                                  ExtractQRegister(instr, 5, 0);
27806                                              // VRINTP{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27807                                              vrintp(dt,
27808                                                     QRegister(rd),
27809                                                     QRegister(rm));
27810                                              break;
27811                                            }
27812                                          }
27813                                          break;
27814                                        }
27815                                      }
27816                                      break;
27817                                    }
27818                                    case 0x00030000: {
27819                                      // 0xffb30000
27820                                      switch (instr & 0x00000440) {
27821                                        case 0x00000000: {
27822                                          // 0xffb30000
27823                                          switch (instr & 0x000c0100) {
27824                                            case 0x00080000: {
27825                                              // 0xffbb0000
27826                                              DataType dt = Dt_op_3_Decode(
27827                                                  (instr >> 7) & 0x1);
27828                                              if (dt.Is(
27829                                                      kDataTypeValueInvalid)) {
27830                                                UnallocatedT32(instr);
27831                                                return;
27832                                              }
27833                                              unsigned rd =
27834                                                  ExtractDRegister(instr,
27835                                                                   22,
27836                                                                   12);
27837                                              unsigned rm =
27838                                                  ExtractDRegister(instr, 5, 0);
27839                                              // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27840                                              vcvta(dt,
27841                                                    F32,
27842                                                    DRegister(rd),
27843                                                    DRegister(rm));
27844                                              break;
27845                                            }
27846                                            case 0x00080100: {
27847                                              // 0xffbb0100
27848                                              DataType dt = Dt_op_3_Decode(
27849                                                  (instr >> 7) & 0x1);
27850                                              if (dt.Is(
27851                                                      kDataTypeValueInvalid)) {
27852                                                UnallocatedT32(instr);
27853                                                return;
27854                                              }
27855                                              unsigned rd =
27856                                                  ExtractDRegister(instr,
27857                                                                   22,
27858                                                                   12);
27859                                              unsigned rm =
27860                                                  ExtractDRegister(instr, 5, 0);
27861                                              // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27862                                              vcvtn(dt,
27863                                                    F32,
27864                                                    DRegister(rd),
27865                                                    DRegister(rm));
27866                                              break;
27867                                            }
27868                                            default:
27869                                              UnallocatedT32(instr);
27870                                              break;
27871                                          }
27872                                          break;
27873                                        }
27874                                        case 0x00000040: {
27875                                          // 0xffb30040
27876                                          switch (instr & 0x000c0100) {
27877                                            case 0x00080000: {
27878                                              // 0xffbb0040
27879                                              DataType dt = Dt_op_3_Decode(
27880                                                  (instr >> 7) & 0x1);
27881                                              if (dt.Is(
27882                                                      kDataTypeValueInvalid)) {
27883                                                UnallocatedT32(instr);
27884                                                return;
27885                                              }
27886                                              if (((instr >> 12) & 1) != 0) {
27887                                                UnallocatedT32(instr);
27888                                                return;
27889                                              }
27890                                              unsigned rd =
27891                                                  ExtractQRegister(instr,
27892                                                                   22,
27893                                                                   12);
27894                                              if ((instr & 1) != 0) {
27895                                                UnallocatedT32(instr);
27896                                                return;
27897                                              }
27898                                              unsigned rm =
27899                                                  ExtractQRegister(instr, 5, 0);
27900                                              // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27901                                              vcvta(dt,
27902                                                    F32,
27903                                                    QRegister(rd),
27904                                                    QRegister(rm));
27905                                              break;
27906                                            }
27907                                            case 0x00080100: {
27908                                              // 0xffbb0140
27909                                              DataType dt = Dt_op_3_Decode(
27910                                                  (instr >> 7) & 0x1);
27911                                              if (dt.Is(
27912                                                      kDataTypeValueInvalid)) {
27913                                                UnallocatedT32(instr);
27914                                                return;
27915                                              }
27916                                              if (((instr >> 12) & 1) != 0) {
27917                                                UnallocatedT32(instr);
27918                                                return;
27919                                              }
27920                                              unsigned rd =
27921                                                  ExtractQRegister(instr,
27922                                                                   22,
27923                                                                   12);
27924                                              if ((instr & 1) != 0) {
27925                                                UnallocatedT32(instr);
27926                                                return;
27927                                              }
27928                                              unsigned rm =
27929                                                  ExtractQRegister(instr, 5, 0);
27930                                              // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27931                                              vcvtn(dt,
27932                                                    F32,
27933                                                    QRegister(rd),
27934                                                    QRegister(rm));
27935                                              break;
27936                                            }
27937                                            default:
27938                                              UnallocatedT32(instr);
27939                                              break;
27940                                          }
27941                                          break;
27942                                        }
27943                                        case 0x00000400: {
27944                                          // 0xffb30400
27945                                          switch (instr & 0x00000080) {
27946                                            case 0x00000000: {
27947                                              // 0xffb30400
27948                                              DataType dt = Dt_F_size_4_Decode(
27949                                                  ((instr >> 18) & 0x3) |
27950                                                  ((instr >> 6) & 0x4));
27951                                              if (dt.Is(
27952                                                      kDataTypeValueInvalid)) {
27953                                                UnallocatedT32(instr);
27954                                                return;
27955                                              }
27956                                              unsigned rd =
27957                                                  ExtractDRegister(instr,
27958                                                                   22,
27959                                                                   12);
27960                                              unsigned rm =
27961                                                  ExtractDRegister(instr, 5, 0);
27962                                              // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27963                                              vrecpe(CurrentCond(),
27964                                                     dt,
27965                                                     DRegister(rd),
27966                                                     DRegister(rm));
27967                                              break;
27968                                            }
27969                                            case 0x00000080: {
27970                                              // 0xffb30480
27971                                              DataType dt = Dt_F_size_4_Decode(
27972                                                  ((instr >> 18) & 0x3) |
27973                                                  ((instr >> 6) & 0x4));
27974                                              if (dt.Is(
27975                                                      kDataTypeValueInvalid)) {
27976                                                UnallocatedT32(instr);
27977                                                return;
27978                                              }
27979                                              unsigned rd =
27980                                                  ExtractDRegister(instr,
27981                                                                   22,
27982                                                                   12);
27983                                              unsigned rm =
27984                                                  ExtractDRegister(instr, 5, 0);
27985                                              // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27986                                              vrsqrte(CurrentCond(),
27987                                                      dt,
27988                                                      DRegister(rd),
27989                                                      DRegister(rm));
27990                                              break;
27991                                            }
27992                                          }
27993                                          break;
27994                                        }
27995                                        case 0x00000440: {
27996                                          // 0xffb30440
27997                                          switch (instr & 0x00000080) {
27998                                            case 0x00000000: {
27999                                              // 0xffb30440
28000                                              DataType dt = Dt_F_size_4_Decode(
28001                                                  ((instr >> 18) & 0x3) |
28002                                                  ((instr >> 6) & 0x4));
28003                                              if (dt.Is(
28004                                                      kDataTypeValueInvalid)) {
28005                                                UnallocatedT32(instr);
28006                                                return;
28007                                              }
28008                                              if (((instr >> 12) & 1) != 0) {
28009                                                UnallocatedT32(instr);
28010                                                return;
28011                                              }
28012                                              unsigned rd =
28013                                                  ExtractQRegister(instr,
28014                                                                   22,
28015                                                                   12);
28016                                              if ((instr & 1) != 0) {
28017                                                UnallocatedT32(instr);
28018                                                return;
28019                                              }
28020                                              unsigned rm =
28021                                                  ExtractQRegister(instr, 5, 0);
28022                                              // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28023                                              vrecpe(CurrentCond(),
28024                                                     dt,
28025                                                     QRegister(rd),
28026                                                     QRegister(rm));
28027                                              break;
28028                                            }
28029                                            case 0x00000080: {
28030                                              // 0xffb304c0
28031                                              DataType dt = Dt_F_size_4_Decode(
28032                                                  ((instr >> 18) & 0x3) |
28033                                                  ((instr >> 6) & 0x4));
28034                                              if (dt.Is(
28035                                                      kDataTypeValueInvalid)) {
28036                                                UnallocatedT32(instr);
28037                                                return;
28038                                              }
28039                                              if (((instr >> 12) & 1) != 0) {
28040                                                UnallocatedT32(instr);
28041                                                return;
28042                                              }
28043                                              unsigned rd =
28044                                                  ExtractQRegister(instr,
28045                                                                   22,
28046                                                                   12);
28047                                              if ((instr & 1) != 0) {
28048                                                UnallocatedT32(instr);
28049                                                return;
28050                                              }
28051                                              unsigned rm =
28052                                                  ExtractQRegister(instr, 5, 0);
28053                                              // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28054                                              vrsqrte(CurrentCond(),
28055                                                      dt,
28056                                                      QRegister(rd),
28057                                                      QRegister(rm));
28058                                              break;
28059                                            }
28060                                          }
28061                                          break;
28062                                        }
28063                                      }
28064                                      break;
28065                                    }
28066                                    case 0x00030200: {
28067                                      // 0xffb30200
28068                                      switch (instr & 0x000c0440) {
28069                                        case 0x00080000: {
28070                                          // 0xffbb0200
28071                                          switch (instr & 0x00000100) {
28072                                            case 0x00000000: {
28073                                              // 0xffbb0200
28074                                              DataType dt = Dt_op_3_Decode(
28075                                                  (instr >> 7) & 0x1);
28076                                              if (dt.Is(
28077                                                      kDataTypeValueInvalid)) {
28078                                                UnallocatedT32(instr);
28079                                                return;
28080                                              }
28081                                              unsigned rd =
28082                                                  ExtractDRegister(instr,
28083                                                                   22,
28084                                                                   12);
28085                                              unsigned rm =
28086                                                  ExtractDRegister(instr, 5, 0);
28087                                              // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28088                                              vcvtp(dt,
28089                                                    F32,
28090                                                    DRegister(rd),
28091                                                    DRegister(rm));
28092                                              break;
28093                                            }
28094                                            case 0x00000100: {
28095                                              // 0xffbb0300
28096                                              DataType dt = Dt_op_3_Decode(
28097                                                  (instr >> 7) & 0x1);
28098                                              if (dt.Is(
28099                                                      kDataTypeValueInvalid)) {
28100                                                UnallocatedT32(instr);
28101                                                return;
28102                                              }
28103                                              unsigned rd =
28104                                                  ExtractDRegister(instr,
28105                                                                   22,
28106                                                                   12);
28107                                              unsigned rm =
28108                                                  ExtractDRegister(instr, 5, 0);
28109                                              // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28110                                              vcvtm(dt,
28111                                                    F32,
28112                                                    DRegister(rd),
28113                                                    DRegister(rm));
28114                                              break;
28115                                            }
28116                                          }
28117                                          break;
28118                                        }
28119                                        case 0x00080040: {
28120                                          // 0xffbb0240
28121                                          switch (instr & 0x00000100) {
28122                                            case 0x00000000: {
28123                                              // 0xffbb0240
28124                                              DataType dt = Dt_op_3_Decode(
28125                                                  (instr >> 7) & 0x1);
28126                                              if (dt.Is(
28127                                                      kDataTypeValueInvalid)) {
28128                                                UnallocatedT32(instr);
28129                                                return;
28130                                              }
28131                                              if (((instr >> 12) & 1) != 0) {
28132                                                UnallocatedT32(instr);
28133                                                return;
28134                                              }
28135                                              unsigned rd =
28136                                                  ExtractQRegister(instr,
28137                                                                   22,
28138                                                                   12);
28139                                              if ((instr & 1) != 0) {
28140                                                UnallocatedT32(instr);
28141                                                return;
28142                                              }
28143                                              unsigned rm =
28144                                                  ExtractQRegister(instr, 5, 0);
28145                                              // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28146                                              vcvtp(dt,
28147                                                    F32,
28148                                                    QRegister(rd),
28149                                                    QRegister(rm));
28150                                              break;
28151                                            }
28152                                            case 0x00000100: {
28153                                              // 0xffbb0340
28154                                              DataType dt = Dt_op_3_Decode(
28155                                                  (instr >> 7) & 0x1);
28156                                              if (dt.Is(
28157                                                      kDataTypeValueInvalid)) {
28158                                                UnallocatedT32(instr);
28159                                                return;
28160                                              }
28161                                              if (((instr >> 12) & 1) != 0) {
28162                                                UnallocatedT32(instr);
28163                                                return;
28164                                              }
28165                                              unsigned rd =
28166                                                  ExtractQRegister(instr,
28167                                                                   22,
28168                                                                   12);
28169                                              if ((instr & 1) != 0) {
28170                                                UnallocatedT32(instr);
28171                                                return;
28172                                              }
28173                                              unsigned rm =
28174                                                  ExtractQRegister(instr, 5, 0);
28175                                              // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28176                                              vcvtm(dt,
28177                                                    F32,
28178                                                    QRegister(rd),
28179                                                    QRegister(rm));
28180                                              break;
28181                                            }
28182                                          }
28183                                          break;
28184                                        }
28185                                        case 0x00080400: {
28186                                          // 0xffbb0600
28187                                          DataType dt1 = Dt_op_1_Decode1(
28188                                              (instr >> 7) & 0x3);
28189                                          if (dt1.Is(kDataTypeValueInvalid)) {
28190                                            UnallocatedT32(instr);
28191                                            return;
28192                                          }
28193                                          DataType dt2 = Dt_op_1_Decode2(
28194                                              (instr >> 7) & 0x3);
28195                                          if (dt2.Is(kDataTypeValueInvalid)) {
28196                                            UnallocatedT32(instr);
28197                                            return;
28198                                          }
28199                                          unsigned rd =
28200                                              ExtractDRegister(instr, 22, 12);
28201                                          unsigned rm =
28202                                              ExtractDRegister(instr, 5, 0);
28203                                          // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28204                                          vcvt(CurrentCond(),
28205                                               dt1,
28206                                               dt2,
28207                                               DRegister(rd),
28208                                               DRegister(rm));
28209                                          break;
28210                                        }
28211                                        case 0x00080440: {
28212                                          // 0xffbb0640
28213                                          DataType dt1 = Dt_op_1_Decode1(
28214                                              (instr >> 7) & 0x3);
28215                                          if (dt1.Is(kDataTypeValueInvalid)) {
28216                                            UnallocatedT32(instr);
28217                                            return;
28218                                          }
28219                                          DataType dt2 = Dt_op_1_Decode2(
28220                                              (instr >> 7) & 0x3);
28221                                          if (dt2.Is(kDataTypeValueInvalid)) {
28222                                            UnallocatedT32(instr);
28223                                            return;
28224                                          }
28225                                          if (((instr >> 12) & 1) != 0) {
28226                                            UnallocatedT32(instr);
28227                                            return;
28228                                          }
28229                                          unsigned rd =
28230                                              ExtractQRegister(instr, 22, 12);
28231                                          if ((instr & 1) != 0) {
28232                                            UnallocatedT32(instr);
28233                                            return;
28234                                          }
28235                                          unsigned rm =
28236                                              ExtractQRegister(instr, 5, 0);
28237                                          // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28238                                          vcvt(CurrentCond(),
28239                                               dt1,
28240                                               dt2,
28241                                               QRegister(rd),
28242                                               QRegister(rm));
28243                                          break;
28244                                        }
28245                                        default:
28246                                          UnallocatedT32(instr);
28247                                          break;
28248                                      }
28249                                      break;
28250                                    }
28251                                  }
28252                                  break;
28253                                }
28254                                case 0x00000800: {
28255                                  // 0xffb00800
28256                                  switch (instr & 0x00000440) {
28257                                    case 0x00000000: {
28258                                      // 0xffb00800
28259                                      unsigned rd =
28260                                          ExtractDRegister(instr, 22, 12);
28261                                      unsigned first =
28262                                          ExtractDRegister(instr, 7, 16);
28263                                      unsigned length;
28264                                      SpacingType spacing = kSingle;
28265                                      switch ((instr >> 8) & 0x3) {
28266                                        default:
28267                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
28268                                        case 0x0:
28269                                          length = 1;
28270                                          break;
28271                                        case 0x1:
28272                                          length = 2;
28273                                          break;
28274                                        case 0x2:
28275                                          length = 3;
28276                                          break;
28277                                        case 0x3:
28278                                          length = 4;
28279                                          break;
28280                                      }
28281                                      unsigned last = first + length - 1;
28282                                      TransferType transfer = kMultipleLanes;
28283                                      unsigned rm =
28284                                          ExtractDRegister(instr, 5, 0);
28285                                      // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
28286                                      vtbl(CurrentCond(),
28287                                           Untyped8,
28288                                           DRegister(rd),
28289                                           NeonRegisterList(DRegister(first),
28290                                                            DRegister(last),
28291                                                            spacing,
28292                                                            transfer),
28293                                           DRegister(rm));
28294                                      break;
28295                                    }
28296                                    case 0x00000040: {
28297                                      // 0xffb00840
28298                                      unsigned rd =
28299                                          ExtractDRegister(instr, 22, 12);
28300                                      unsigned first =
28301                                          ExtractDRegister(instr, 7, 16);
28302                                      unsigned length;
28303                                      SpacingType spacing = kSingle;
28304                                      switch ((instr >> 8) & 0x3) {
28305                                        default:
28306                                          VIXL_UNREACHABLE_OR_FALLTHROUGH();
28307                                        case 0x0:
28308                                          length = 1;
28309                                          break;
28310                                        case 0x1:
28311                                          length = 2;
28312                                          break;
28313                                        case 0x2:
28314                                          length = 3;
28315                                          break;
28316                                        case 0x3:
28317                                          length = 4;
28318                                          break;
28319                                      }
28320                                      unsigned last = first + length - 1;
28321                                      TransferType transfer = kMultipleLanes;
28322                                      unsigned rm =
28323                                          ExtractDRegister(instr, 5, 0);
28324                                      // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
28325                                      vtbx(CurrentCond(),
28326                                           Untyped8,
28327                                           DRegister(rd),
28328                                           NeonRegisterList(DRegister(first),
28329                                                            DRegister(last),
28330                                                            spacing,
28331                                                            transfer),
28332                                           DRegister(rm));
28333                                      break;
28334                                    }
28335                                    case 0x00000400: {
28336                                      // 0xffb00c00
28337                                      if ((instr & 0x00000380) == 0x00000000) {
28338                                        unsigned lane;
28339                                        DataType dt =
28340                                            Dt_imm4_1_Decode((instr >> 16) &
28341                                                                 0xf,
28342                                                             &lane);
28343                                        if (dt.Is(kDataTypeValueInvalid)) {
28344                                          UnallocatedT32(instr);
28345                                          return;
28346                                        }
28347                                        unsigned rd =
28348                                            ExtractDRegister(instr, 22, 12);
28349                                        unsigned rm =
28350                                            ExtractDRegister(instr, 5, 0);
28351                                        // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28352                                        vdup(CurrentCond(),
28353                                             dt,
28354                                             DRegister(rd),
28355                                             DRegisterLane(rm, lane));
28356                                      } else {
28357                                        UnallocatedT32(instr);
28358                                      }
28359                                      break;
28360                                    }
28361                                    case 0x00000440: {
28362                                      // 0xffb00c40
28363                                      if ((instr & 0x00000380) == 0x00000000) {
28364                                        unsigned lane;
28365                                        DataType dt =
28366                                            Dt_imm4_1_Decode((instr >> 16) &
28367                                                                 0xf,
28368                                                             &lane);
28369                                        if (dt.Is(kDataTypeValueInvalid)) {
28370                                          UnallocatedT32(instr);
28371                                          return;
28372                                        }
28373                                        if (((instr >> 12) & 1) != 0) {
28374                                          UnallocatedT32(instr);
28375                                          return;
28376                                        }
28377                                        unsigned rd =
28378                                            ExtractQRegister(instr, 22, 12);
28379                                        unsigned rm =
28380                                            ExtractDRegister(instr, 5, 0);
28381                                        // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28382                                        vdup(CurrentCond(),
28383                                             dt,
28384                                             QRegister(rd),
28385                                             DRegisterLane(rm, lane));
28386                                      } else {
28387                                        UnallocatedT32(instr);
28388                                      }
28389                                      break;
28390                                    }
28391                                  }
28392                                  break;
28393                                }
28394                              }
28395                              break;
28396                            }
28397                          }
28398                          break;
28399                        }
28400                        default: {
28401                          switch (instr & 0x00000c40) {
28402                            case 0x00000000: {
28403                              // 0xef800000
28404                              switch (instr & 0x00000300) {
28405                                case 0x00000000: {
28406                                  // 0xef800000
28407                                  if (((instr & 0x300000) == 0x300000)) {
28408                                    UnallocatedT32(instr);
28409                                    return;
28410                                  }
28411                                  DataType dt =
28412                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28413                                                         ((instr >> 26) & 0x4));
28414                                  if (dt.Is(kDataTypeValueInvalid)) {
28415                                    UnallocatedT32(instr);
28416                                    return;
28417                                  }
28418                                  if (((instr >> 12) & 1) != 0) {
28419                                    UnallocatedT32(instr);
28420                                    return;
28421                                  }
28422                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28423                                  unsigned rn = ExtractDRegister(instr, 7, 16);
28424                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28425                                  // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28426                                  vaddl(CurrentCond(),
28427                                        dt,
28428                                        QRegister(rd),
28429                                        DRegister(rn),
28430                                        DRegister(rm));
28431                                  break;
28432                                }
28433                                case 0x00000100: {
28434                                  // 0xef800100
28435                                  if (((instr & 0x300000) == 0x300000)) {
28436                                    UnallocatedT32(instr);
28437                                    return;
28438                                  }
28439                                  DataType dt =
28440                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28441                                                         ((instr >> 26) & 0x4));
28442                                  if (dt.Is(kDataTypeValueInvalid)) {
28443                                    UnallocatedT32(instr);
28444                                    return;
28445                                  }
28446                                  if (((instr >> 12) & 1) != 0) {
28447                                    UnallocatedT32(instr);
28448                                    return;
28449                                  }
28450                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28451                                  if (((instr >> 16) & 1) != 0) {
28452                                    UnallocatedT32(instr);
28453                                    return;
28454                                  }
28455                                  unsigned rn = ExtractQRegister(instr, 7, 16);
28456                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28457                                  // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
28458                                  vaddw(CurrentCond(),
28459                                        dt,
28460                                        QRegister(rd),
28461                                        QRegister(rn),
28462                                        DRegister(rm));
28463                                  break;
28464                                }
28465                                case 0x00000200: {
28466                                  // 0xef800200
28467                                  if (((instr & 0x300000) == 0x300000)) {
28468                                    UnallocatedT32(instr);
28469                                    return;
28470                                  }
28471                                  DataType dt =
28472                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28473                                                         ((instr >> 26) & 0x4));
28474                                  if (dt.Is(kDataTypeValueInvalid)) {
28475                                    UnallocatedT32(instr);
28476                                    return;
28477                                  }
28478                                  if (((instr >> 12) & 1) != 0) {
28479                                    UnallocatedT32(instr);
28480                                    return;
28481                                  }
28482                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28483                                  unsigned rn = ExtractDRegister(instr, 7, 16);
28484                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28485                                  // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28486                                  vsubl(CurrentCond(),
28487                                        dt,
28488                                        QRegister(rd),
28489                                        DRegister(rn),
28490                                        DRegister(rm));
28491                                  break;
28492                                }
28493                                case 0x00000300: {
28494                                  // 0xef800300
28495                                  if (((instr & 0x300000) == 0x300000)) {
28496                                    UnallocatedT32(instr);
28497                                    return;
28498                                  }
28499                                  DataType dt =
28500                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28501                                                         ((instr >> 26) & 0x4));
28502                                  if (dt.Is(kDataTypeValueInvalid)) {
28503                                    UnallocatedT32(instr);
28504                                    return;
28505                                  }
28506                                  if (((instr >> 12) & 1) != 0) {
28507                                    UnallocatedT32(instr);
28508                                    return;
28509                                  }
28510                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28511                                  if (((instr >> 16) & 1) != 0) {
28512                                    UnallocatedT32(instr);
28513                                    return;
28514                                  }
28515                                  unsigned rn = ExtractQRegister(instr, 7, 16);
28516                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28517                                  // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
28518                                  vsubw(CurrentCond(),
28519                                        dt,
28520                                        QRegister(rd),
28521                                        QRegister(rn),
28522                                        DRegister(rm));
28523                                  break;
28524                                }
28525                              }
28526                              break;
28527                            }
28528                            case 0x00000040: {
28529                              // 0xef800040
28530                              switch (instr & 0x00000200) {
28531                                case 0x00000000: {
28532                                  // 0xef800040
28533                                  switch (instr & 0x10000000) {
28534                                    case 0x00000000: {
28535                                      // 0xef800040
28536                                      if (((instr & 0x300000) == 0x300000)) {
28537                                        UnallocatedT32(instr);
28538                                        return;
28539                                      }
28540                                      DataType dt =
28541                                          Dt_size_9_Decode((instr >> 20) & 0x3,
28542                                                           (instr >> 8) & 0x1);
28543                                      if (dt.Is(kDataTypeValueInvalid)) {
28544                                        UnallocatedT32(instr);
28545                                        return;
28546                                      }
28547                                      unsigned rd =
28548                                          ExtractDRegister(instr, 22, 12);
28549                                      unsigned rn =
28550                                          ExtractDRegister(instr, 7, 16);
28551                                      int lane;
28552                                      unsigned rm =
28553                                          ExtractDRegisterAndLane(instr,
28554                                                                  dt,
28555                                                                  5,
28556                                                                  0,
28557                                                                  &lane);
28558                                      // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28559                                      vmla(CurrentCond(),
28560                                           dt,
28561                                           DRegister(rd),
28562                                           DRegister(rn),
28563                                           DRegisterLane(rm, lane));
28564                                      break;
28565                                    }
28566                                    case 0x10000000: {
28567                                      // 0xff800040
28568                                      if (((instr & 0x300000) == 0x300000)) {
28569                                        UnallocatedT32(instr);
28570                                        return;
28571                                      }
28572                                      DataType dt =
28573                                          Dt_size_9_Decode((instr >> 20) & 0x3,
28574                                                           (instr >> 8) & 0x1);
28575                                      if (dt.Is(kDataTypeValueInvalid)) {
28576                                        UnallocatedT32(instr);
28577                                        return;
28578                                      }
28579                                      if (((instr >> 12) & 1) != 0) {
28580                                        UnallocatedT32(instr);
28581                                        return;
28582                                      }
28583                                      unsigned rd =
28584                                          ExtractQRegister(instr, 22, 12);
28585                                      if (((instr >> 16) & 1) != 0) {
28586                                        UnallocatedT32(instr);
28587                                        return;
28588                                      }
28589                                      unsigned rn =
28590                                          ExtractQRegister(instr, 7, 16);
28591                                      int lane;
28592                                      unsigned rm =
28593                                          ExtractDRegisterAndLane(instr,
28594                                                                  dt,
28595                                                                  5,
28596                                                                  0,
28597                                                                  &lane);
28598                                      // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28599                                      vmla(CurrentCond(),
28600                                           dt,
28601                                           QRegister(rd),
28602                                           QRegister(rn),
28603                                           DRegisterLane(rm, lane));
28604                                      break;
28605                                    }
28606                                  }
28607                                  break;
28608                                }
28609                                case 0x00000200: {
28610                                  // 0xef800240
28611                                  switch (instr & 0x00000100) {
28612                                    case 0x00000000: {
28613                                      // 0xef800240
28614                                      if (((instr & 0x300000) == 0x300000)) {
28615                                        UnallocatedT32(instr);
28616                                        return;
28617                                      }
28618                                      DataType dt =
28619                                          Dt_size_11_Decode((instr >> 20) & 0x3,
28620                                                            (instr >> 28) &
28621                                                                0x1);
28622                                      if (dt.Is(kDataTypeValueInvalid)) {
28623                                        UnallocatedT32(instr);
28624                                        return;
28625                                      }
28626                                      if (((instr >> 12) & 1) != 0) {
28627                                        UnallocatedT32(instr);
28628                                        return;
28629                                      }
28630                                      unsigned rd =
28631                                          ExtractQRegister(instr, 22, 12);
28632                                      unsigned rn =
28633                                          ExtractDRegister(instr, 7, 16);
28634                                      int lane;
28635                                      unsigned rm =
28636                                          ExtractDRegisterAndLane(instr,
28637                                                                  dt,
28638                                                                  5,
28639                                                                  0,
28640                                                                  &lane);
28641                                      // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28642                                      vmlal(CurrentCond(),
28643                                            dt,
28644                                            QRegister(rd),
28645                                            DRegister(rn),
28646                                            DRegisterLane(rm, lane));
28647                                      break;
28648                                    }
28649                                    case 0x00000100: {
28650                                      // 0xef800340
28651                                      if ((instr & 0x10000000) == 0x00000000) {
28652                                        if (((instr & 0x300000) == 0x300000)) {
28653                                          UnallocatedT32(instr);
28654                                          return;
28655                                        }
28656                                        DataType dt = Dt_size_13_Decode(
28657                                            (instr >> 20) & 0x3);
28658                                        if (dt.Is(kDataTypeValueInvalid)) {
28659                                          UnallocatedT32(instr);
28660                                          return;
28661                                        }
28662                                        if (((instr >> 12) & 1) != 0) {
28663                                          UnallocatedT32(instr);
28664                                          return;
28665                                        }
28666                                        unsigned rd =
28667                                            ExtractQRegister(instr, 22, 12);
28668                                        unsigned rn =
28669                                            ExtractDRegister(instr, 7, 16);
28670                                        uint32_t mvm = (instr & 0xf) |
28671                                                       ((instr >> 1) & 0x10);
28672                                        uint32_t shift = 4;
28673                                        if (dt.Is(S16)) {
28674                                          shift = 3;
28675                                        }
28676                                        uint32_t vm = mvm & ((1 << shift) - 1);
28677                                        uint32_t index = mvm >> shift;
28678                                        // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
28679                                        vqdmlal(CurrentCond(),
28680                                                dt,
28681                                                QRegister(rd),
28682                                                DRegister(rn),
28683                                                DRegister(vm),
28684                                                index);
28685                                      } else {
28686                                        UnallocatedT32(instr);
28687                                      }
28688                                      break;
28689                                    }
28690                                  }
28691                                  break;
28692                                }
28693                              }
28694                              break;
28695                            }
28696                            case 0x00000400: {
28697                              // 0xef800400
28698                              switch (instr & 0x00000300) {
28699                                case 0x00000000: {
28700                                  // 0xef800400
28701                                  switch (instr & 0x10000000) {
28702                                    case 0x00000000: {
28703                                      // 0xef800400
28704                                      if (((instr & 0x300000) == 0x300000)) {
28705                                        UnallocatedT32(instr);
28706                                        return;
28707                                      }
28708                                      DataType dt =
28709                                          Dt_size_3_Decode((instr >> 20) & 0x3);
28710                                      if (dt.Is(kDataTypeValueInvalid)) {
28711                                        UnallocatedT32(instr);
28712                                        return;
28713                                      }
28714                                      unsigned rd =
28715                                          ExtractDRegister(instr, 22, 12);
28716                                      if (((instr >> 16) & 1) != 0) {
28717                                        UnallocatedT32(instr);
28718                                        return;
28719                                      }
28720                                      unsigned rn =
28721                                          ExtractQRegister(instr, 7, 16);
28722                                      if ((instr & 1) != 0) {
28723                                        UnallocatedT32(instr);
28724                                        return;
28725                                      }
28726                                      unsigned rm =
28727                                          ExtractQRegister(instr, 5, 0);
28728                                      // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
28729                                      vaddhn(CurrentCond(),
28730                                             dt,
28731                                             DRegister(rd),
28732                                             QRegister(rn),
28733                                             QRegister(rm));
28734                                      break;
28735                                    }
28736                                    case 0x10000000: {
28737                                      // 0xff800400
28738                                      if (((instr & 0x300000) == 0x300000)) {
28739                                        UnallocatedT32(instr);
28740                                        return;
28741                                      }
28742                                      DataType dt =
28743                                          Dt_size_3_Decode((instr >> 20) & 0x3);
28744                                      if (dt.Is(kDataTypeValueInvalid)) {
28745                                        UnallocatedT32(instr);
28746                                        return;
28747                                      }
28748                                      unsigned rd =
28749                                          ExtractDRegister(instr, 22, 12);
28750                                      if (((instr >> 16) & 1) != 0) {
28751                                        UnallocatedT32(instr);
28752                                        return;
28753                                      }
28754                                      unsigned rn =
28755                                          ExtractQRegister(instr, 7, 16);
28756                                      if ((instr & 1) != 0) {
28757                                        UnallocatedT32(instr);
28758                                        return;
28759                                      }
28760                                      unsigned rm =
28761                                          ExtractQRegister(instr, 5, 0);
28762                                      // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
28763                                      vraddhn(CurrentCond(),
28764                                              dt,
28765                                              DRegister(rd),
28766                                              QRegister(rn),
28767                                              QRegister(rm));
28768                                      break;
28769                                    }
28770                                  }
28771                                  break;
28772                                }
28773                                case 0x00000100: {
28774                                  // 0xef800500
28775                                  if (((instr & 0x300000) == 0x300000)) {
28776                                    UnallocatedT32(instr);
28777                                    return;
28778                                  }
28779                                  DataType dt =
28780                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28781                                                         ((instr >> 26) & 0x4));
28782                                  if (dt.Is(kDataTypeValueInvalid)) {
28783                                    UnallocatedT32(instr);
28784                                    return;
28785                                  }
28786                                  if (((instr >> 12) & 1) != 0) {
28787                                    UnallocatedT32(instr);
28788                                    return;
28789                                  }
28790                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28791                                  unsigned rn = ExtractDRegister(instr, 7, 16);
28792                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28793                                  // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28794                                  vabal(CurrentCond(),
28795                                        dt,
28796                                        QRegister(rd),
28797                                        DRegister(rn),
28798                                        DRegister(rm));
28799                                  break;
28800                                }
28801                                case 0x00000200: {
28802                                  // 0xef800600
28803                                  switch (instr & 0x10000000) {
28804                                    case 0x00000000: {
28805                                      // 0xef800600
28806                                      if (((instr & 0x300000) == 0x300000)) {
28807                                        UnallocatedT32(instr);
28808                                        return;
28809                                      }
28810                                      DataType dt =
28811                                          Dt_size_3_Decode((instr >> 20) & 0x3);
28812                                      if (dt.Is(kDataTypeValueInvalid)) {
28813                                        UnallocatedT32(instr);
28814                                        return;
28815                                      }
28816                                      unsigned rd =
28817                                          ExtractDRegister(instr, 22, 12);
28818                                      if (((instr >> 16) & 1) != 0) {
28819                                        UnallocatedT32(instr);
28820                                        return;
28821                                      }
28822                                      unsigned rn =
28823                                          ExtractQRegister(instr, 7, 16);
28824                                      if ((instr & 1) != 0) {
28825                                        UnallocatedT32(instr);
28826                                        return;
28827                                      }
28828                                      unsigned rm =
28829                                          ExtractQRegister(instr, 5, 0);
28830                                      // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
28831                                      vsubhn(CurrentCond(),
28832                                             dt,
28833                                             DRegister(rd),
28834                                             QRegister(rn),
28835                                             QRegister(rm));
28836                                      break;
28837                                    }
28838                                    case 0x10000000: {
28839                                      // 0xff800600
28840                                      if (((instr & 0x300000) == 0x300000)) {
28841                                        UnallocatedT32(instr);
28842                                        return;
28843                                      }
28844                                      DataType dt =
28845                                          Dt_size_3_Decode((instr >> 20) & 0x3);
28846                                      if (dt.Is(kDataTypeValueInvalid)) {
28847                                        UnallocatedT32(instr);
28848                                        return;
28849                                      }
28850                                      unsigned rd =
28851                                          ExtractDRegister(instr, 22, 12);
28852                                      if (((instr >> 16) & 1) != 0) {
28853                                        UnallocatedT32(instr);
28854                                        return;
28855                                      }
28856                                      unsigned rn =
28857                                          ExtractQRegister(instr, 7, 16);
28858                                      if ((instr & 1) != 0) {
28859                                        UnallocatedT32(instr);
28860                                        return;
28861                                      }
28862                                      unsigned rm =
28863                                          ExtractQRegister(instr, 5, 0);
28864                                      // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
28865                                      vrsubhn(CurrentCond(),
28866                                              dt,
28867                                              DRegister(rd),
28868                                              QRegister(rn),
28869                                              QRegister(rm));
28870                                      break;
28871                                    }
28872                                  }
28873                                  break;
28874                                }
28875                                case 0x00000300: {
28876                                  // 0xef800700
28877                                  if (((instr & 0x300000) == 0x300000)) {
28878                                    UnallocatedT32(instr);
28879                                    return;
28880                                  }
28881                                  DataType dt =
28882                                      Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28883                                                         ((instr >> 26) & 0x4));
28884                                  if (dt.Is(kDataTypeValueInvalid)) {
28885                                    UnallocatedT32(instr);
28886                                    return;
28887                                  }
28888                                  if (((instr >> 12) & 1) != 0) {
28889                                    UnallocatedT32(instr);
28890                                    return;
28891                                  }
28892                                  unsigned rd = ExtractQRegister(instr, 22, 12);
28893                                  unsigned rn = ExtractDRegister(instr, 7, 16);
28894                                  unsigned rm = ExtractDRegister(instr, 5, 0);
28895                                  // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28896                                  vabdl(CurrentCond(),
28897                                        dt,
28898                                        QRegister(rd),
28899                                        DRegister(rn),
28900                                        DRegister(rm));
28901                                  break;
28902                                }
28903                              }
28904                              break;
28905                            }
28906                            case 0x00000440: {
28907                              // 0xef800440
28908                              switch (instr & 0x00000200) {
28909                                case 0x00000000: {
28910                                  // 0xef800440
28911                                  switch (instr & 0x10000000) {
28912                                    case 0x00000000: {
28913                                      // 0xef800440
28914                                      if (((instr & 0x300000) == 0x300000)) {
28915                                        UnallocatedT32(instr);
28916                                        return;
28917                                      }
28918                                      DataType dt =
28919                                          Dt_size_9_Decode((instr >> 20) & 0x3,
28920                                                           (instr >> 8) & 0x1);
28921                                      if (dt.Is(kDataTypeValueInvalid)) {
28922                                        UnallocatedT32(instr);
28923                                        return;
28924                                      }
28925                                      unsigned rd =
28926                                          ExtractDRegister(instr, 22, 12);
28927                                      unsigned rn =
28928                                          ExtractDRegister(instr, 7, 16);
28929                                      int lane;
28930                                      unsigned rm =
28931                                          ExtractDRegisterAndLane(instr,
28932                                                                  dt,
28933                                                                  5,
28934                                                                  0,
28935                                                                  &lane);
28936                                      // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28937                                      vmls(CurrentCond(),
28938                                           dt,
28939                                           DRegister(rd),
28940                                           DRegister(rn),
28941                                           DRegisterLane(rm, lane));
28942                                      break;
28943                                    }
28944                                    case 0x10000000: {
28945                                      // 0xff800440
28946                                      if (((instr & 0x300000) == 0x300000)) {
28947                                        UnallocatedT32(instr);
28948                                        return;
28949                                      }
28950                                      DataType dt =
28951                                          Dt_size_9_Decode((instr >> 20) & 0x3,
28952                                                           (instr >> 8) & 0x1);
28953                                      if (dt.Is(kDataTypeValueInvalid)) {
28954                                        UnallocatedT32(instr);
28955                                        return;
28956                                      }
28957                                      if (((instr >> 12) & 1) != 0) {
28958                                        UnallocatedT32(instr);
28959                                        return;
28960                                      }
28961                                      unsigned rd =
28962                                          ExtractQRegister(instr, 22, 12);
28963                                      if (((instr >> 16) & 1) != 0) {
28964                                        UnallocatedT32(instr);
28965                                        return;
28966                                      }
28967                                      unsigned rn =
28968                                          ExtractQRegister(instr, 7, 16);
28969                                      int lane;
28970                                      unsigned rm =
28971                                          ExtractDRegisterAndLane(instr,
28972                                                                  dt,
28973                                                                  5,
28974                                                                  0,
28975                                                                  &lane);
28976                                      // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28977                                      vmls(CurrentCond(),
28978                                           dt,
28979                                           QRegister(rd),
28980                                           QRegister(rn),
28981                                           DRegisterLane(rm, lane));
28982                                      break;
28983                                    }
28984                                  }
28985                                  break;
28986                                }
28987                                case 0x00000200: {
28988                                  // 0xef800640
28989                                  switch (instr & 0x00000100) {
28990                                    case 0x00000000: {
28991                                      // 0xef800640
28992                                      if (((instr & 0x300000) == 0x300000)) {
28993                                        UnallocatedT32(instr);
28994                                        return;
28995                                      }
28996                                      DataType dt =
28997                                          Dt_size_11_Decode((instr >> 20) & 0x3,
28998                                                            (instr >> 28) &
28999                                                                0x1);
29000                                      if (dt.Is(kDataTypeValueInvalid)) {
29001                                        UnallocatedT32(instr);
29002                                        return;
29003                                      }
29004                                      if (((instr >> 12) & 1) != 0) {
29005                                        UnallocatedT32(instr);
29006                                        return;
29007                                      }
29008                                      unsigned rd =
29009                                          ExtractQRegister(instr, 22, 12);
29010                                      unsigned rn =
29011                                          ExtractDRegister(instr, 7, 16);
29012                                      int lane;
29013                                      unsigned rm =
29014                                          ExtractDRegisterAndLane(instr,
29015                                                                  dt,
29016                                                                  5,
29017                                                                  0,
29018                                                                  &lane);
29019                                      // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29020                                      vmlsl(CurrentCond(),
29021                                            dt,
29022                                            QRegister(rd),
29023                                            DRegister(rn),
29024                                            DRegisterLane(rm, lane));
29025                                      break;
29026                                    }
29027                                    case 0x00000100: {
29028                                      // 0xef800740
29029                                      if ((instr & 0x10000000) == 0x00000000) {
29030                                        if (((instr & 0x300000) == 0x300000)) {
29031                                          UnallocatedT32(instr);
29032                                          return;
29033                                        }
29034                                        DataType dt = Dt_size_13_Decode(
29035                                            (instr >> 20) & 0x3);
29036                                        if (dt.Is(kDataTypeValueInvalid)) {
29037                                          UnallocatedT32(instr);
29038                                          return;
29039                                        }
29040                                        if (((instr >> 12) & 1) != 0) {
29041                                          UnallocatedT32(instr);
29042                                          return;
29043                                        }
29044                                        unsigned rd =
29045                                            ExtractQRegister(instr, 22, 12);
29046                                        unsigned rn =
29047                                            ExtractDRegister(instr, 7, 16);
29048                                        uint32_t mvm = (instr & 0xf) |
29049                                                       ((instr >> 1) & 0x10);
29050                                        uint32_t shift = 4;
29051                                        if (dt.Is(S16)) {
29052                                          shift = 3;
29053                                        }
29054                                        uint32_t vm = mvm & ((1 << shift) - 1);
29055                                        uint32_t index = mvm >> shift;
29056                                        // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
29057                                        vqdmlsl(CurrentCond(),
29058                                                dt,
29059                                                QRegister(rd),
29060                                                DRegister(rn),
29061                                                DRegister(vm),
29062                                                index);
29063                                      } else {
29064                                        UnallocatedT32(instr);
29065                                      }
29066                                      break;
29067                                    }
29068                                  }
29069                                  break;
29070                                }
29071                              }
29072                              break;
29073                            }
29074                            case 0x00000800: {
29075                              // 0xef800800
29076                              switch (instr & 0x00000300) {
29077                                case 0x00000000: {
29078                                  // 0xef800800
29079                                  if (((instr & 0x300000) == 0x300000)) {
29080                                    UnallocatedT32(instr);
29081                                    return;
29082                                  }
29083                                  DataType dt =
29084                                      Dt_size_12_Decode((instr >> 20) & 0x3,
29085                                                        (instr >> 28) & 0x1);
29086                                  if (dt.Is(kDataTypeValueInvalid)) {
29087                                    UnallocatedT32(instr);
29088                                    return;
29089                                  }
29090                                  if (((instr >> 12) & 1) != 0) {
29091                                    UnallocatedT32(instr);
29092                                    return;
29093                                  }
29094                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29095                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29096                                  unsigned rm = ExtractDRegister(instr, 5, 0);
29097                                  // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29098                                  vmlal(CurrentCond(),
29099                                        dt,
29100                                        QRegister(rd),
29101                                        DRegister(rn),
29102                                        DRegister(rm));
29103                                  break;
29104                                }
29105                                case 0x00000100: {
29106                                  // 0xef800900
29107                                  if ((instr & 0x10000000) == 0x00000000) {
29108                                    if (((instr & 0x300000) == 0x300000)) {
29109                                      UnallocatedT32(instr);
29110                                      return;
29111                                    }
29112                                    DataType dt =
29113                                        Dt_size_13_Decode((instr >> 20) & 0x3);
29114                                    if (dt.Is(kDataTypeValueInvalid)) {
29115                                      UnallocatedT32(instr);
29116                                      return;
29117                                    }
29118                                    if (((instr >> 12) & 1) != 0) {
29119                                      UnallocatedT32(instr);
29120                                      return;
29121                                    }
29122                                    unsigned rd =
29123                                        ExtractQRegister(instr, 22, 12);
29124                                    unsigned rn =
29125                                        ExtractDRegister(instr, 7, 16);
29126                                    unsigned rm = ExtractDRegister(instr, 5, 0);
29127                                    // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29128                                    vqdmlal(CurrentCond(),
29129                                            dt,
29130                                            QRegister(rd),
29131                                            DRegister(rn),
29132                                            DRegister(rm));
29133                                  } else {
29134                                    UnallocatedT32(instr);
29135                                  }
29136                                  break;
29137                                }
29138                                case 0x00000200: {
29139                                  // 0xef800a00
29140                                  if (((instr & 0x300000) == 0x300000)) {
29141                                    UnallocatedT32(instr);
29142                                    return;
29143                                  }
29144                                  DataType dt =
29145                                      Dt_size_12_Decode((instr >> 20) & 0x3,
29146                                                        (instr >> 28) & 0x1);
29147                                  if (dt.Is(kDataTypeValueInvalid)) {
29148                                    UnallocatedT32(instr);
29149                                    return;
29150                                  }
29151                                  if (((instr >> 12) & 1) != 0) {
29152                                    UnallocatedT32(instr);
29153                                    return;
29154                                  }
29155                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29156                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29157                                  unsigned rm = ExtractDRegister(instr, 5, 0);
29158                                  // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29159                                  vmlsl(CurrentCond(),
29160                                        dt,
29161                                        QRegister(rd),
29162                                        DRegister(rn),
29163                                        DRegister(rm));
29164                                  break;
29165                                }
29166                                case 0x00000300: {
29167                                  // 0xef800b00
29168                                  if ((instr & 0x10000000) == 0x00000000) {
29169                                    if (((instr & 0x300000) == 0x300000)) {
29170                                      UnallocatedT32(instr);
29171                                      return;
29172                                    }
29173                                    DataType dt =
29174                                        Dt_size_13_Decode((instr >> 20) & 0x3);
29175                                    if (dt.Is(kDataTypeValueInvalid)) {
29176                                      UnallocatedT32(instr);
29177                                      return;
29178                                    }
29179                                    if (((instr >> 12) & 1) != 0) {
29180                                      UnallocatedT32(instr);
29181                                      return;
29182                                    }
29183                                    unsigned rd =
29184                                        ExtractQRegister(instr, 22, 12);
29185                                    unsigned rn =
29186                                        ExtractDRegister(instr, 7, 16);
29187                                    unsigned rm = ExtractDRegister(instr, 5, 0);
29188                                    // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29189                                    vqdmlsl(CurrentCond(),
29190                                            dt,
29191                                            QRegister(rd),
29192                                            DRegister(rn),
29193                                            DRegister(rm));
29194                                  } else {
29195                                    UnallocatedT32(instr);
29196                                  }
29197                                  break;
29198                                }
29199                              }
29200                              break;
29201                            }
29202                            case 0x00000840: {
29203                              // 0xef800840
29204                              switch (instr & 0x00000200) {
29205                                case 0x00000000: {
29206                                  // 0xef800840
29207                                  switch (instr & 0x10000000) {
29208                                    case 0x00000000: {
29209                                      // 0xef800840
29210                                      if (((instr & 0x300000) == 0x300000)) {
29211                                        UnallocatedT32(instr);
29212                                        return;
29213                                      }
29214                                      DataType dt = Dt_F_size_3_Decode(
29215                                          ((instr >> 20) & 0x3) |
29216                                          ((instr >> 6) & 0x4));
29217                                      if (dt.Is(kDataTypeValueInvalid)) {
29218                                        UnallocatedT32(instr);
29219                                        return;
29220                                      }
29221                                      unsigned rd =
29222                                          ExtractDRegister(instr, 22, 12);
29223                                      unsigned rn =
29224                                          ExtractDRegister(instr, 7, 16);
29225                                      uint32_t mvm =
29226                                          (instr & 0xf) | ((instr >> 1) & 0x10);
29227                                      uint32_t shift = 4;
29228                                      if (dt.Is(I16)) {
29229                                        shift = 3;
29230                                      }
29231                                      uint32_t vm = mvm & ((1 << shift) - 1);
29232                                      uint32_t index = mvm >> shift;
29233                                      // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29234                                      vmul(CurrentCond(),
29235                                           dt,
29236                                           DRegister(rd),
29237                                           DRegister(rn),
29238                                           DRegister(vm),
29239                                           index);
29240                                      break;
29241                                    }
29242                                    case 0x10000000: {
29243                                      // 0xff800840
29244                                      if (((instr & 0x300000) == 0x300000)) {
29245                                        UnallocatedT32(instr);
29246                                        return;
29247                                      }
29248                                      DataType dt = Dt_F_size_3_Decode(
29249                                          ((instr >> 20) & 0x3) |
29250                                          ((instr >> 6) & 0x4));
29251                                      if (dt.Is(kDataTypeValueInvalid)) {
29252                                        UnallocatedT32(instr);
29253                                        return;
29254                                      }
29255                                      if (((instr >> 12) & 1) != 0) {
29256                                        UnallocatedT32(instr);
29257                                        return;
29258                                      }
29259                                      unsigned rd =
29260                                          ExtractQRegister(instr, 22, 12);
29261                                      if (((instr >> 16) & 1) != 0) {
29262                                        UnallocatedT32(instr);
29263                                        return;
29264                                      }
29265                                      unsigned rn =
29266                                          ExtractQRegister(instr, 7, 16);
29267                                      uint32_t mvm =
29268                                          (instr & 0xf) | ((instr >> 1) & 0x10);
29269                                      uint32_t shift = 4;
29270                                      if (dt.Is(I16)) {
29271                                        shift = 3;
29272                                      }
29273                                      uint32_t vm = mvm & ((1 << shift) - 1);
29274                                      uint32_t index = mvm >> shift;
29275                                      // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29276                                      vmul(CurrentCond(),
29277                                           dt,
29278                                           QRegister(rd),
29279                                           QRegister(rn),
29280                                           DRegister(vm),
29281                                           index);
29282                                      break;
29283                                    }
29284                                  }
29285                                  break;
29286                                }
29287                                case 0x00000200: {
29288                                  // 0xef800a40
29289                                  switch (instr & 0x00000100) {
29290                                    case 0x00000000: {
29291                                      // 0xef800a40
29292                                      if (((instr & 0x300000) == 0x300000)) {
29293                                        UnallocatedT32(instr);
29294                                        return;
29295                                      }
29296                                      DataType dt = Dt_U_size_2_Decode(
29297                                          ((instr >> 20) & 0x3) |
29298                                          ((instr >> 26) & 0x4));
29299                                      if (dt.Is(kDataTypeValueInvalid)) {
29300                                        UnallocatedT32(instr);
29301                                        return;
29302                                      }
29303                                      if (((instr >> 12) & 1) != 0) {
29304                                        UnallocatedT32(instr);
29305                                        return;
29306                                      }
29307                                      unsigned rd =
29308                                          ExtractQRegister(instr, 22, 12);
29309                                      unsigned rn =
29310                                          ExtractDRegister(instr, 7, 16);
29311                                      uint32_t mvm =
29312                                          (instr & 0xf) | ((instr >> 1) & 0x10);
29313                                      uint32_t shift = 4;
29314                                      if (dt.Is(S16) || dt.Is(U16)) {
29315                                        shift = 3;
29316                                      }
29317                                      uint32_t vm = mvm & ((1 << shift) - 1);
29318                                      uint32_t index = mvm >> shift;
29319                                      // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29320                                      vmull(CurrentCond(),
29321                                            dt,
29322                                            QRegister(rd),
29323                                            DRegister(rn),
29324                                            DRegister(vm),
29325                                            index);
29326                                      break;
29327                                    }
29328                                    case 0x00000100: {
29329                                      // 0xef800b40
29330                                      if ((instr & 0x10000000) == 0x00000000) {
29331                                        if (((instr & 0x300000) == 0x300000)) {
29332                                          UnallocatedT32(instr);
29333                                          return;
29334                                        }
29335                                        DataType dt = Dt_size_13_Decode(
29336                                            (instr >> 20) & 0x3);
29337                                        if (dt.Is(kDataTypeValueInvalid)) {
29338                                          UnallocatedT32(instr);
29339                                          return;
29340                                        }
29341                                        if (((instr >> 12) & 1) != 0) {
29342                                          UnallocatedT32(instr);
29343                                          return;
29344                                        }
29345                                        unsigned rd =
29346                                            ExtractQRegister(instr, 22, 12);
29347                                        unsigned rn =
29348                                            ExtractDRegister(instr, 7, 16);
29349                                        int lane;
29350                                        unsigned rm =
29351                                            ExtractDRegisterAndLane(instr,
29352                                                                    dt,
29353                                                                    5,
29354                                                                    0,
29355                                                                    &lane);
29356                                        // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29357                                        vqdmull(CurrentCond(),
29358                                                dt,
29359                                                QRegister(rd),
29360                                                DRegister(rn),
29361                                                DRegisterLane(rm, lane));
29362                                      } else {
29363                                        UnallocatedT32(instr);
29364                                      }
29365                                      break;
29366                                    }
29367                                  }
29368                                  break;
29369                                }
29370                              }
29371                              break;
29372                            }
29373                            case 0x00000c00: {
29374                              // 0xef800c00
29375                              switch (instr & 0x00000100) {
29376                                case 0x00000000: {
29377                                  // 0xef800c00
29378                                  if (((instr & 0x300000) == 0x300000)) {
29379                                    UnallocatedT32(instr);
29380                                    return;
29381                                  }
29382                                  DataType dt = Dt_op_U_size_1_Decode(
29383                                      ((instr >> 20) & 0x3) |
29384                                      ((instr >> 26) & 0x4) |
29385                                      ((instr >> 6) & 0x8));
29386                                  if (dt.Is(kDataTypeValueInvalid)) {
29387                                    UnallocatedT32(instr);
29388                                    return;
29389                                  }
29390                                  if (((instr >> 12) & 1) != 0) {
29391                                    UnallocatedT32(instr);
29392                                    return;
29393                                  }
29394                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29395                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29396                                  unsigned rm = ExtractDRegister(instr, 5, 0);
29397                                  // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
29398                                  vmull(CurrentCond(),
29399                                        dt,
29400                                        QRegister(rd),
29401                                        DRegister(rn),
29402                                        DRegister(rm));
29403                                  break;
29404                                }
29405                                case 0x00000100: {
29406                                  // 0xef800d00
29407                                  if ((instr & 0x10000200) == 0x00000000) {
29408                                    if (((instr & 0x300000) == 0x300000)) {
29409                                      UnallocatedT32(instr);
29410                                      return;
29411                                    }
29412                                    DataType dt =
29413                                        Dt_size_13_Decode((instr >> 20) & 0x3);
29414                                    if (dt.Is(kDataTypeValueInvalid)) {
29415                                      UnallocatedT32(instr);
29416                                      return;
29417                                    }
29418                                    if (((instr >> 12) & 1) != 0) {
29419                                      UnallocatedT32(instr);
29420                                      return;
29421                                    }
29422                                    unsigned rd =
29423                                        ExtractQRegister(instr, 22, 12);
29424                                    unsigned rn =
29425                                        ExtractDRegister(instr, 7, 16);
29426                                    unsigned rm = ExtractDRegister(instr, 5, 0);
29427                                    // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29428                                    vqdmull(CurrentCond(),
29429                                            dt,
29430                                            QRegister(rd),
29431                                            DRegister(rn),
29432                                            DRegister(rm));
29433                                  } else {
29434                                    UnallocatedT32(instr);
29435                                  }
29436                                  break;
29437                                }
29438                              }
29439                              break;
29440                            }
29441                            case 0x00000c40: {
29442                              // 0xef800c40
29443                              switch (instr & 0x10000300) {
29444                                case 0x00000000: {
29445                                  // 0xef800c40
29446                                  if (((instr & 0x300000) == 0x300000)) {
29447                                    UnallocatedT32(instr);
29448                                    return;
29449                                  }
29450                                  DataType dt =
29451                                      Dt_size_13_Decode((instr >> 20) & 0x3);
29452                                  if (dt.Is(kDataTypeValueInvalid)) {
29453                                    UnallocatedT32(instr);
29454                                    return;
29455                                  }
29456                                  unsigned rd = ExtractDRegister(instr, 22, 12);
29457                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29458                                  int lane;
29459                                  unsigned rm = ExtractDRegisterAndLane(instr,
29460                                                                        dt,
29461                                                                        5,
29462                                                                        0,
29463                                                                        &lane);
29464                                  // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29465                                  vqdmulh(CurrentCond(),
29466                                          dt,
29467                                          DRegister(rd),
29468                                          DRegister(rn),
29469                                          DRegisterLane(rm, lane));
29470                                  break;
29471                                }
29472                                case 0x00000100: {
29473                                  // 0xef800d40
29474                                  if (((instr & 0x300000) == 0x300000)) {
29475                                    UnallocatedT32(instr);
29476                                    return;
29477                                  }
29478                                  DataType dt =
29479                                      Dt_size_13_Decode((instr >> 20) & 0x3);
29480                                  if (dt.Is(kDataTypeValueInvalid)) {
29481                                    UnallocatedT32(instr);
29482                                    return;
29483                                  }
29484                                  unsigned rd = ExtractDRegister(instr, 22, 12);
29485                                  unsigned rn = ExtractDRegister(instr, 7, 16);
29486                                  int lane;
29487                                  unsigned rm = ExtractDRegisterAndLane(instr,
29488                                                                        dt,
29489                                                                        5,
29490                                                                        0,
29491                                                                        &lane);
29492                                  // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29493                                  vqrdmulh(CurrentCond(),
29494                                           dt,
29495                                           DRegister(rd),
29496                                           DRegister(rn),
29497                                           DRegisterLane(rm, lane));
29498                                  break;
29499                                }
29500                                case 0x10000000: {
29501                                  // 0xff800c40
29502                                  if (((instr & 0x300000) == 0x300000)) {
29503                                    UnallocatedT32(instr);
29504                                    return;
29505                                  }
29506                                  DataType dt =
29507                                      Dt_size_13_Decode((instr >> 20) & 0x3);
29508                                  if (dt.Is(kDataTypeValueInvalid)) {
29509                                    UnallocatedT32(instr);
29510                                    return;
29511                                  }
29512                                  if (((instr >> 12) & 1) != 0) {
29513                                    UnallocatedT32(instr);
29514                                    return;
29515                                  }
29516                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29517                                  if (((instr >> 16) & 1) != 0) {
29518                                    UnallocatedT32(instr);
29519                                    return;
29520                                  }
29521                                  unsigned rn = ExtractQRegister(instr, 7, 16);
29522                                  int lane;
29523                                  unsigned rm = ExtractDRegisterAndLane(instr,
29524                                                                        dt,
29525                                                                        5,
29526                                                                        0,
29527                                                                        &lane);
29528                                  // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29529                                  vqdmulh(CurrentCond(),
29530                                          dt,
29531                                          QRegister(rd),
29532                                          QRegister(rn),
29533                                          DRegisterLane(rm, lane));
29534                                  break;
29535                                }
29536                                case 0x10000100: {
29537                                  // 0xff800d40
29538                                  if (((instr & 0x300000) == 0x300000)) {
29539                                    UnallocatedT32(instr);
29540                                    return;
29541                                  }
29542                                  DataType dt =
29543                                      Dt_size_13_Decode((instr >> 20) & 0x3);
29544                                  if (dt.Is(kDataTypeValueInvalid)) {
29545                                    UnallocatedT32(instr);
29546                                    return;
29547                                  }
29548                                  if (((instr >> 12) & 1) != 0) {
29549                                    UnallocatedT32(instr);
29550                                    return;
29551                                  }
29552                                  unsigned rd = ExtractQRegister(instr, 22, 12);
29553                                  if (((instr >> 16) & 1) != 0) {
29554                                    UnallocatedT32(instr);
29555                                    return;
29556                                  }
29557                                  unsigned rn = ExtractQRegister(instr, 7, 16);
29558                                  int lane;
29559                                  unsigned rm = ExtractDRegisterAndLane(instr,
29560                                                                        dt,
29561                                                                        5,
29562                                                                        0,
29563                                                                        &lane);
29564                                  // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29565                                  vqrdmulh(CurrentCond(),
29566                                           dt,
29567                                           QRegister(rd),
29568                                           QRegister(rn),
29569                                           DRegisterLane(rm, lane));
29570                                  break;
29571                                }
29572                                default:
29573                                  UnallocatedT32(instr);
29574                                  break;
29575                              }
29576                              break;
29577                            }
29578                          }
29579                          break;
29580                        }
29581                      }
29582                      break;
29583                    }
29584                  }
29585                  break;
29586                }
29587                case 0x01000010: {
29588                  // 0xef000010
29589                  switch (instr & 0x00800040) {
29590                    case 0x00000000: {
29591                      // 0xef000010
29592                      switch (instr & 0x00000f00) {
29593                        case 0x00000000: {
29594                          // 0xef000010
29595                          DataType dt = Dt_U_size_3_Decode(
29596                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29597                          if (dt.Is(kDataTypeValueInvalid)) {
29598                            UnallocatedT32(instr);
29599                            return;
29600                          }
29601                          unsigned rd = ExtractDRegister(instr, 22, 12);
29602                          unsigned rn = ExtractDRegister(instr, 7, 16);
29603                          unsigned rm = ExtractDRegister(instr, 5, 0);
29604                          // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29605                          vqadd(CurrentCond(),
29606                                dt,
29607                                DRegister(rd),
29608                                DRegister(rn),
29609                                DRegister(rm));
29610                          break;
29611                        }
29612                        case 0x00000100: {
29613                          // 0xef000110
29614                          switch (instr & 0x10300000) {
29615                            case 0x00000000: {
29616                              // 0xef000110
29617                              unsigned rd = ExtractDRegister(instr, 22, 12);
29618                              unsigned rn = ExtractDRegister(instr, 7, 16);
29619                              unsigned rm = ExtractDRegister(instr, 5, 0);
29620                              // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29621                              vand(CurrentCond(),
29622                                   kDataTypeValueNone,
29623                                   DRegister(rd),
29624                                   DRegister(rn),
29625                                   DRegister(rm));
29626                              break;
29627                            }
29628                            case 0x00100000: {
29629                              // 0xef100110
29630                              unsigned rd = ExtractDRegister(instr, 22, 12);
29631                              unsigned rn = ExtractDRegister(instr, 7, 16);
29632                              unsigned rm = ExtractDRegister(instr, 5, 0);
29633                              // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29634                              vbic(CurrentCond(),
29635                                   kDataTypeValueNone,
29636                                   DRegister(rd),
29637                                   DRegister(rn),
29638                                   DRegister(rm));
29639                              break;
29640                            }
29641                            case 0x00200000: {
29642                              // 0xef200110
29643                              if (((instr & 0x00000040) == 0x00000000) &&
29644                                  ((((Uint32((instr >> 7)) & Uint32(0x1))
29645                                     << 4) |
29646                                    (Uint32((instr >> 16)) & Uint32(0xf))) ==
29647                                   (((Uint32((instr >> 5)) & Uint32(0x1))
29648                                     << 4) |
29649                                    (Uint32(instr) & Uint32(0xf))))) {
29650                                unsigned rd = ExtractDRegister(instr, 22, 12);
29651                                unsigned rm = ExtractDRegister(instr, 7, 16);
29652                                // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1
29653                                vmov(CurrentCond(),
29654                                     kDataTypeValueNone,
29655                                     DRegister(rd),
29656                                     DRegister(rm));
29657                                return;
29658                              }
29659                              unsigned rd = ExtractDRegister(instr, 22, 12);
29660                              unsigned rn = ExtractDRegister(instr, 7, 16);
29661                              unsigned rm = ExtractDRegister(instr, 5, 0);
29662                              // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29663                              vorr(CurrentCond(),
29664                                   kDataTypeValueNone,
29665                                   DRegister(rd),
29666                                   DRegister(rn),
29667                                   DRegister(rm));
29668                              break;
29669                            }
29670                            case 0x00300000: {
29671                              // 0xef300110
29672                              unsigned rd = ExtractDRegister(instr, 22, 12);
29673                              unsigned rn = ExtractDRegister(instr, 7, 16);
29674                              unsigned rm = ExtractDRegister(instr, 5, 0);
29675                              // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29676                              vorn(CurrentCond(),
29677                                   kDataTypeValueNone,
29678                                   DRegister(rd),
29679                                   DRegister(rn),
29680                                   DRegister(rm));
29681                              break;
29682                            }
29683                            case 0x10000000: {
29684                              // 0xff000110
29685                              unsigned rd = ExtractDRegister(instr, 22, 12);
29686                              unsigned rn = ExtractDRegister(instr, 7, 16);
29687                              unsigned rm = ExtractDRegister(instr, 5, 0);
29688                              // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29689                              veor(CurrentCond(),
29690                                   kDataTypeValueNone,
29691                                   DRegister(rd),
29692                                   DRegister(rn),
29693                                   DRegister(rm));
29694                              break;
29695                            }
29696                            case 0x10100000: {
29697                              // 0xff100110
29698                              unsigned rd = ExtractDRegister(instr, 22, 12);
29699                              unsigned rn = ExtractDRegister(instr, 7, 16);
29700                              unsigned rm = ExtractDRegister(instr, 5, 0);
29701                              // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29702                              vbsl(CurrentCond(),
29703                                   kDataTypeValueNone,
29704                                   DRegister(rd),
29705                                   DRegister(rn),
29706                                   DRegister(rm));
29707                              break;
29708                            }
29709                            case 0x10200000: {
29710                              // 0xff200110
29711                              unsigned rd = ExtractDRegister(instr, 22, 12);
29712                              unsigned rn = ExtractDRegister(instr, 7, 16);
29713                              unsigned rm = ExtractDRegister(instr, 5, 0);
29714                              // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29715                              vbit(CurrentCond(),
29716                                   kDataTypeValueNone,
29717                                   DRegister(rd),
29718                                   DRegister(rn),
29719                                   DRegister(rm));
29720                              break;
29721                            }
29722                            case 0x10300000: {
29723                              // 0xff300110
29724                              unsigned rd = ExtractDRegister(instr, 22, 12);
29725                              unsigned rn = ExtractDRegister(instr, 7, 16);
29726                              unsigned rm = ExtractDRegister(instr, 5, 0);
29727                              // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29728                              vbif(CurrentCond(),
29729                                   kDataTypeValueNone,
29730                                   DRegister(rd),
29731                                   DRegister(rn),
29732                                   DRegister(rm));
29733                              break;
29734                            }
29735                          }
29736                          break;
29737                        }
29738                        case 0x00000200: {
29739                          // 0xef000210
29740                          DataType dt = Dt_U_size_3_Decode(
29741                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29742                          if (dt.Is(kDataTypeValueInvalid)) {
29743                            UnallocatedT32(instr);
29744                            return;
29745                          }
29746                          unsigned rd = ExtractDRegister(instr, 22, 12);
29747                          unsigned rn = ExtractDRegister(instr, 7, 16);
29748                          unsigned rm = ExtractDRegister(instr, 5, 0);
29749                          // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29750                          vqsub(CurrentCond(),
29751                                dt,
29752                                DRegister(rd),
29753                                DRegister(rn),
29754                                DRegister(rm));
29755                          break;
29756                        }
29757                        case 0x00000300: {
29758                          // 0xef000310
29759                          DataType dt = Dt_U_size_1_Decode(
29760                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29761                          if (dt.Is(kDataTypeValueInvalid)) {
29762                            UnallocatedT32(instr);
29763                            return;
29764                          }
29765                          unsigned rd = ExtractDRegister(instr, 22, 12);
29766                          unsigned rn = ExtractDRegister(instr, 7, 16);
29767                          unsigned rm = ExtractDRegister(instr, 5, 0);
29768                          // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29769                          vcge(CurrentCond(),
29770                               dt,
29771                               DRegister(rd),
29772                               DRegister(rn),
29773                               DRegister(rm));
29774                          break;
29775                        }
29776                        case 0x00000400: {
29777                          // 0xef000410
29778                          DataType dt = Dt_U_size_3_Decode(
29779                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29780                          if (dt.Is(kDataTypeValueInvalid)) {
29781                            UnallocatedT32(instr);
29782                            return;
29783                          }
29784                          unsigned rd = ExtractDRegister(instr, 22, 12);
29785                          unsigned rm = ExtractDRegister(instr, 5, 0);
29786                          unsigned rn = ExtractDRegister(instr, 7, 16);
29787                          // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
29788                          vqshl(CurrentCond(),
29789                                dt,
29790                                DRegister(rd),
29791                                DRegister(rm),
29792                                DRegister(rn));
29793                          break;
29794                        }
29795                        case 0x00000500: {
29796                          // 0xef000510
29797                          DataType dt = Dt_U_size_3_Decode(
29798                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29799                          if (dt.Is(kDataTypeValueInvalid)) {
29800                            UnallocatedT32(instr);
29801                            return;
29802                          }
29803                          unsigned rd = ExtractDRegister(instr, 22, 12);
29804                          unsigned rm = ExtractDRegister(instr, 5, 0);
29805                          unsigned rn = ExtractDRegister(instr, 7, 16);
29806                          // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
29807                          vqrshl(CurrentCond(),
29808                                 dt,
29809                                 DRegister(rd),
29810                                 DRegister(rm),
29811                                 DRegister(rn));
29812                          break;
29813                        }
29814                        case 0x00000600: {
29815                          // 0xef000610
29816                          DataType dt = Dt_U_size_1_Decode(
29817                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29818                          if (dt.Is(kDataTypeValueInvalid)) {
29819                            UnallocatedT32(instr);
29820                            return;
29821                          }
29822                          unsigned rd = ExtractDRegister(instr, 22, 12);
29823                          unsigned rn = ExtractDRegister(instr, 7, 16);
29824                          unsigned rm = ExtractDRegister(instr, 5, 0);
29825                          // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29826                          vmin(CurrentCond(),
29827                               dt,
29828                               DRegister(rd),
29829                               DRegister(rn),
29830                               DRegister(rm));
29831                          break;
29832                        }
29833                        case 0x00000700: {
29834                          // 0xef000710
29835                          DataType dt = Dt_U_size_1_Decode(
29836                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29837                          if (dt.Is(kDataTypeValueInvalid)) {
29838                            UnallocatedT32(instr);
29839                            return;
29840                          }
29841                          unsigned rd = ExtractDRegister(instr, 22, 12);
29842                          unsigned rn = ExtractDRegister(instr, 7, 16);
29843                          unsigned rm = ExtractDRegister(instr, 5, 0);
29844                          // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; T1
29845                          vaba(CurrentCond(),
29846                               dt,
29847                               DRegister(rd),
29848                               DRegister(rn),
29849                               DRegister(rm));
29850                          break;
29851                        }
29852                        case 0x00000800: {
29853                          // 0xef000810
29854                          switch (instr & 0x10000000) {
29855                            case 0x00000000: {
29856                              // 0xef000810
29857                              DataType dt =
29858                                  Dt_size_7_Decode((instr >> 20) & 0x3);
29859                              if (dt.Is(kDataTypeValueInvalid)) {
29860                                UnallocatedT32(instr);
29861                                return;
29862                              }
29863                              unsigned rd = ExtractDRegister(instr, 22, 12);
29864                              unsigned rn = ExtractDRegister(instr, 7, 16);
29865                              unsigned rm = ExtractDRegister(instr, 5, 0);
29866                              // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29867                              vtst(CurrentCond(),
29868                                   dt,
29869                                   DRegister(rd),
29870                                   DRegister(rn),
29871                                   DRegister(rm));
29872                              break;
29873                            }
29874                            case 0x10000000: {
29875                              // 0xff000810
29876                              DataType dt =
29877                                  Dt_size_4_Decode((instr >> 20) & 0x3);
29878                              if (dt.Is(kDataTypeValueInvalid)) {
29879                                UnallocatedT32(instr);
29880                                return;
29881                              }
29882                              unsigned rd = ExtractDRegister(instr, 22, 12);
29883                              unsigned rn = ExtractDRegister(instr, 7, 16);
29884                              unsigned rm = ExtractDRegister(instr, 5, 0);
29885                              // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29886                              vceq(CurrentCond(),
29887                                   dt,
29888                                   DRegister(rd),
29889                                   DRegister(rn),
29890                                   DRegister(rm));
29891                              break;
29892                            }
29893                          }
29894                          break;
29895                        }
29896                        case 0x00000900: {
29897                          // 0xef000910
29898                          DataType dt = Dt_op_size_1_Decode(
29899                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29900                          if (dt.Is(kDataTypeValueInvalid)) {
29901                            UnallocatedT32(instr);
29902                            return;
29903                          }
29904                          unsigned rd = ExtractDRegister(instr, 22, 12);
29905                          unsigned rn = ExtractDRegister(instr, 7, 16);
29906                          unsigned rm = ExtractDRegister(instr, 5, 0);
29907                          // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29908                          vmul(CurrentCond(),
29909                               dt,
29910                               DRegister(rd),
29911                               DRegister(rn),
29912                               DRegister(rm));
29913                          break;
29914                        }
29915                        case 0x00000a00: {
29916                          // 0xef000a10
29917                          DataType dt = Dt_U_size_1_Decode(
29918                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29919                          if (dt.Is(kDataTypeValueInvalid)) {
29920                            UnallocatedT32(instr);
29921                            return;
29922                          }
29923                          unsigned rd = ExtractDRegister(instr, 22, 12);
29924                          unsigned rn = ExtractDRegister(instr, 7, 16);
29925                          unsigned rm = ExtractDRegister(instr, 5, 0);
29926                          // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29927                          vpmin(CurrentCond(),
29928                                dt,
29929                                DRegister(rd),
29930                                DRegister(rn),
29931                                DRegister(rm));
29932                          break;
29933                        }
29934                        case 0x00000b00: {
29935                          // 0xef000b10
29936                          if ((instr & 0x10000000) == 0x00000000) {
29937                            DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
29938                            if (dt.Is(kDataTypeValueInvalid)) {
29939                              UnallocatedT32(instr);
29940                              return;
29941                            }
29942                            unsigned rd = ExtractDRegister(instr, 22, 12);
29943                            unsigned rn = ExtractDRegister(instr, 7, 16);
29944                            unsigned rm = ExtractDRegister(instr, 5, 0);
29945                            // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29946                            vpadd(CurrentCond(),
29947                                  dt,
29948                                  DRegister(rd),
29949                                  DRegister(rn),
29950                                  DRegister(rm));
29951                          } else {
29952                            UnallocatedT32(instr);
29953                          }
29954                          break;
29955                        }
29956                        case 0x00000c00: {
29957                          // 0xef000c10
29958                          switch (instr & 0x10300000) {
29959                            case 0x00000000: {
29960                              // 0xef000c10
29961                              unsigned rd = ExtractDRegister(instr, 22, 12);
29962                              unsigned rn = ExtractDRegister(instr, 7, 16);
29963                              unsigned rm = ExtractDRegister(instr, 5, 0);
29964                              // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
29965                              vfma(CurrentCond(),
29966                                   F32,
29967                                   DRegister(rd),
29968                                   DRegister(rn),
29969                                   DRegister(rm));
29970                              break;
29971                            }
29972                            case 0x00200000: {
29973                              // 0xef200c10
29974                              unsigned rd = ExtractDRegister(instr, 22, 12);
29975                              unsigned rn = ExtractDRegister(instr, 7, 16);
29976                              unsigned rm = ExtractDRegister(instr, 5, 0);
29977                              // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
29978                              vfms(CurrentCond(),
29979                                   F32,
29980                                   DRegister(rd),
29981                                   DRegister(rn),
29982                                   DRegister(rm));
29983                              break;
29984                            }
29985                            default:
29986                              UnallocatedT32(instr);
29987                              break;
29988                          }
29989                          break;
29990                        }
29991                        case 0x00000d00: {
29992                          // 0xef000d10
29993                          switch (instr & 0x10300000) {
29994                            case 0x00000000: {
29995                              // 0xef000d10
29996                              unsigned rd = ExtractDRegister(instr, 22, 12);
29997                              unsigned rn = ExtractDRegister(instr, 7, 16);
29998                              unsigned rm = ExtractDRegister(instr, 5, 0);
29999                              // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30000                              vmla(CurrentCond(),
30001                                   F32,
30002                                   DRegister(rd),
30003                                   DRegister(rn),
30004                                   DRegister(rm));
30005                              break;
30006                            }
30007                            case 0x00200000: {
30008                              // 0xef200d10
30009                              unsigned rd = ExtractDRegister(instr, 22, 12);
30010                              unsigned rn = ExtractDRegister(instr, 7, 16);
30011                              unsigned rm = ExtractDRegister(instr, 5, 0);
30012                              // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30013                              vmls(CurrentCond(),
30014                                   F32,
30015                                   DRegister(rd),
30016                                   DRegister(rn),
30017                                   DRegister(rm));
30018                              break;
30019                            }
30020                            case 0x10000000: {
30021                              // 0xff000d10
30022                              unsigned rd = ExtractDRegister(instr, 22, 12);
30023                              unsigned rn = ExtractDRegister(instr, 7, 16);
30024                              unsigned rm = ExtractDRegister(instr, 5, 0);
30025                              // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30026                              vmul(CurrentCond(),
30027                                   F32,
30028                                   DRegister(rd),
30029                                   DRegister(rn),
30030                                   DRegister(rm));
30031                              break;
30032                            }
30033                            default:
30034                              UnallocatedT32(instr);
30035                              break;
30036                          }
30037                          break;
30038                        }
30039                        case 0x00000e00: {
30040                          // 0xef000e10
30041                          switch (instr & 0x10300000) {
30042                            case 0x10000000: {
30043                              // 0xff000e10
30044                              unsigned rd = ExtractDRegister(instr, 22, 12);
30045                              unsigned rn = ExtractDRegister(instr, 7, 16);
30046                              unsigned rm = ExtractDRegister(instr, 5, 0);
30047                              // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30048                              vacge(CurrentCond(),
30049                                    F32,
30050                                    DRegister(rd),
30051                                    DRegister(rn),
30052                                    DRegister(rm));
30053                              break;
30054                            }
30055                            case 0x10200000: {
30056                              // 0xff200e10
30057                              unsigned rd = ExtractDRegister(instr, 22, 12);
30058                              unsigned rn = ExtractDRegister(instr, 7, 16);
30059                              unsigned rm = ExtractDRegister(instr, 5, 0);
30060                              // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30061                              vacgt(CurrentCond(),
30062                                    F32,
30063                                    DRegister(rd),
30064                                    DRegister(rn),
30065                                    DRegister(rm));
30066                              break;
30067                            }
30068                            default:
30069                              UnallocatedT32(instr);
30070                              break;
30071                          }
30072                          break;
30073                        }
30074                        case 0x00000f00: {
30075                          // 0xef000f10
30076                          switch (instr & 0x10300000) {
30077                            case 0x00000000: {
30078                              // 0xef000f10
30079                              unsigned rd = ExtractDRegister(instr, 22, 12);
30080                              unsigned rn = ExtractDRegister(instr, 7, 16);
30081                              unsigned rm = ExtractDRegister(instr, 5, 0);
30082                              // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30083                              vrecps(CurrentCond(),
30084                                     F32,
30085                                     DRegister(rd),
30086                                     DRegister(rn),
30087                                     DRegister(rm));
30088                              break;
30089                            }
30090                            case 0x00200000: {
30091                              // 0xef200f10
30092                              unsigned rd = ExtractDRegister(instr, 22, 12);
30093                              unsigned rn = ExtractDRegister(instr, 7, 16);
30094                              unsigned rm = ExtractDRegister(instr, 5, 0);
30095                              // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30096                              vrsqrts(CurrentCond(),
30097                                      F32,
30098                                      DRegister(rd),
30099                                      DRegister(rn),
30100                                      DRegister(rm));
30101                              break;
30102                            }
30103                            case 0x10000000: {
30104                              // 0xff000f10
30105                              unsigned rd = ExtractDRegister(instr, 22, 12);
30106                              unsigned rn = ExtractDRegister(instr, 7, 16);
30107                              unsigned rm = ExtractDRegister(instr, 5, 0);
30108                              // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30109                              vmaxnm(F32,
30110                                     DRegister(rd),
30111                                     DRegister(rn),
30112                                     DRegister(rm));
30113                              if (InITBlock()) {
30114                                UnpredictableT32(instr);
30115                              }
30116                              break;
30117                            }
30118                            case 0x10200000: {
30119                              // 0xff200f10
30120                              unsigned rd = ExtractDRegister(instr, 22, 12);
30121                              unsigned rn = ExtractDRegister(instr, 7, 16);
30122                              unsigned rm = ExtractDRegister(instr, 5, 0);
30123                              // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30124                              vminnm(F32,
30125                                     DRegister(rd),
30126                                     DRegister(rn),
30127                                     DRegister(rm));
30128                              if (InITBlock()) {
30129                                UnpredictableT32(instr);
30130                              }
30131                              break;
30132                            }
30133                            default:
30134                              UnallocatedT32(instr);
30135                              break;
30136                          }
30137                          break;
30138                        }
30139                      }
30140                      break;
30141                    }
30142                    case 0x00000040: {
30143                      // 0xef000050
30144                      switch (instr & 0x00000f00) {
30145                        case 0x00000000: {
30146                          // 0xef000050
30147                          DataType dt = Dt_U_size_3_Decode(
30148                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30149                          if (dt.Is(kDataTypeValueInvalid)) {
30150                            UnallocatedT32(instr);
30151                            return;
30152                          }
30153                          if (((instr >> 12) & 1) != 0) {
30154                            UnallocatedT32(instr);
30155                            return;
30156                          }
30157                          unsigned rd = ExtractQRegister(instr, 22, 12);
30158                          if (((instr >> 16) & 1) != 0) {
30159                            UnallocatedT32(instr);
30160                            return;
30161                          }
30162                          unsigned rn = ExtractQRegister(instr, 7, 16);
30163                          if ((instr & 1) != 0) {
30164                            UnallocatedT32(instr);
30165                            return;
30166                          }
30167                          unsigned rm = ExtractQRegister(instr, 5, 0);
30168                          // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30169                          vqadd(CurrentCond(),
30170                                dt,
30171                                QRegister(rd),
30172                                QRegister(rn),
30173                                QRegister(rm));
30174                          break;
30175                        }
30176                        case 0x00000100: {
30177                          // 0xef000150
30178                          switch (instr & 0x10300000) {
30179                            case 0x00000000: {
30180                              // 0xef000150
30181                              if (((instr >> 12) & 1) != 0) {
30182                                UnallocatedT32(instr);
30183                                return;
30184                              }
30185                              unsigned rd = ExtractQRegister(instr, 22, 12);
30186                              if (((instr >> 16) & 1) != 0) {
30187                                UnallocatedT32(instr);
30188                                return;
30189                              }
30190                              unsigned rn = ExtractQRegister(instr, 7, 16);
30191                              if ((instr & 1) != 0) {
30192                                UnallocatedT32(instr);
30193                                return;
30194                              }
30195                              unsigned rm = ExtractQRegister(instr, 5, 0);
30196                              // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30197                              vand(CurrentCond(),
30198                                   kDataTypeValueNone,
30199                                   QRegister(rd),
30200                                   QRegister(rn),
30201                                   QRegister(rm));
30202                              break;
30203                            }
30204                            case 0x00100000: {
30205                              // 0xef100150
30206                              if (((instr >> 12) & 1) != 0) {
30207                                UnallocatedT32(instr);
30208                                return;
30209                              }
30210                              unsigned rd = ExtractQRegister(instr, 22, 12);
30211                              if (((instr >> 16) & 1) != 0) {
30212                                UnallocatedT32(instr);
30213                                return;
30214                              }
30215                              unsigned rn = ExtractQRegister(instr, 7, 16);
30216                              if ((instr & 1) != 0) {
30217                                UnallocatedT32(instr);
30218                                return;
30219                              }
30220                              unsigned rm = ExtractQRegister(instr, 5, 0);
30221                              // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30222                              vbic(CurrentCond(),
30223                                   kDataTypeValueNone,
30224                                   QRegister(rd),
30225                                   QRegister(rn),
30226                                   QRegister(rm));
30227                              break;
30228                            }
30229                            case 0x00200000: {
30230                              // 0xef200150
30231                              if (((instr & 0x00000040) == 0x00000040) &&
30232                                  ((((Uint32((instr >> 7)) & Uint32(0x1))
30233                                     << 4) |
30234                                    (Uint32((instr >> 16)) & Uint32(0xf))) ==
30235                                   (((Uint32((instr >> 5)) & Uint32(0x1))
30236                                     << 4) |
30237                                    (Uint32(instr) & Uint32(0xf))))) {
30238                                if (((instr >> 12) & 1) != 0) {
30239                                  UnallocatedT32(instr);
30240                                  return;
30241                                }
30242                                unsigned rd = ExtractQRegister(instr, 22, 12);
30243                                if (((instr >> 16) & 1) != 0) {
30244                                  UnallocatedT32(instr);
30245                                  return;
30246                                }
30247                                unsigned rm = ExtractQRegister(instr, 7, 16);
30248                                // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1
30249                                vmov(CurrentCond(),
30250                                     kDataTypeValueNone,
30251                                     QRegister(rd),
30252                                     QRegister(rm));
30253                                return;
30254                              }
30255                              if (((instr >> 12) & 1) != 0) {
30256                                UnallocatedT32(instr);
30257                                return;
30258                              }
30259                              unsigned rd = ExtractQRegister(instr, 22, 12);
30260                              if (((instr >> 16) & 1) != 0) {
30261                                UnallocatedT32(instr);
30262                                return;
30263                              }
30264                              unsigned rn = ExtractQRegister(instr, 7, 16);
30265                              if ((instr & 1) != 0) {
30266                                UnallocatedT32(instr);
30267                                return;
30268                              }
30269                              unsigned rm = ExtractQRegister(instr, 5, 0);
30270                              // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30271                              vorr(CurrentCond(),
30272                                   kDataTypeValueNone,
30273                                   QRegister(rd),
30274                                   QRegister(rn),
30275                                   QRegister(rm));
30276                              break;
30277                            }
30278                            case 0x00300000: {
30279                              // 0xef300150
30280                              if (((instr >> 12) & 1) != 0) {
30281                                UnallocatedT32(instr);
30282                                return;
30283                              }
30284                              unsigned rd = ExtractQRegister(instr, 22, 12);
30285                              if (((instr >> 16) & 1) != 0) {
30286                                UnallocatedT32(instr);
30287                                return;
30288                              }
30289                              unsigned rn = ExtractQRegister(instr, 7, 16);
30290                              if ((instr & 1) != 0) {
30291                                UnallocatedT32(instr);
30292                                return;
30293                              }
30294                              unsigned rm = ExtractQRegister(instr, 5, 0);
30295                              // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30296                              vorn(CurrentCond(),
30297                                   kDataTypeValueNone,
30298                                   QRegister(rd),
30299                                   QRegister(rn),
30300                                   QRegister(rm));
30301                              break;
30302                            }
30303                            case 0x10000000: {
30304                              // 0xff000150
30305                              if (((instr >> 12) & 1) != 0) {
30306                                UnallocatedT32(instr);
30307                                return;
30308                              }
30309                              unsigned rd = ExtractQRegister(instr, 22, 12);
30310                              if (((instr >> 16) & 1) != 0) {
30311                                UnallocatedT32(instr);
30312                                return;
30313                              }
30314                              unsigned rn = ExtractQRegister(instr, 7, 16);
30315                              if ((instr & 1) != 0) {
30316                                UnallocatedT32(instr);
30317                                return;
30318                              }
30319                              unsigned rm = ExtractQRegister(instr, 5, 0);
30320                              // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30321                              veor(CurrentCond(),
30322                                   kDataTypeValueNone,
30323                                   QRegister(rd),
30324                                   QRegister(rn),
30325                                   QRegister(rm));
30326                              break;
30327                            }
30328                            case 0x10100000: {
30329                              // 0xff100150
30330                              if (((instr >> 12) & 1) != 0) {
30331                                UnallocatedT32(instr);
30332                                return;
30333                              }
30334                              unsigned rd = ExtractQRegister(instr, 22, 12);
30335                              if (((instr >> 16) & 1) != 0) {
30336                                UnallocatedT32(instr);
30337                                return;
30338                              }
30339                              unsigned rn = ExtractQRegister(instr, 7, 16);
30340                              if ((instr & 1) != 0) {
30341                                UnallocatedT32(instr);
30342                                return;
30343                              }
30344                              unsigned rm = ExtractQRegister(instr, 5, 0);
30345                              // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30346                              vbsl(CurrentCond(),
30347                                   kDataTypeValueNone,
30348                                   QRegister(rd),
30349                                   QRegister(rn),
30350                                   QRegister(rm));
30351                              break;
30352                            }
30353                            case 0x10200000: {
30354                              // 0xff200150
30355                              if (((instr >> 12) & 1) != 0) {
30356                                UnallocatedT32(instr);
30357                                return;
30358                              }
30359                              unsigned rd = ExtractQRegister(instr, 22, 12);
30360                              if (((instr >> 16) & 1) != 0) {
30361                                UnallocatedT32(instr);
30362                                return;
30363                              }
30364                              unsigned rn = ExtractQRegister(instr, 7, 16);
30365                              if ((instr & 1) != 0) {
30366                                UnallocatedT32(instr);
30367                                return;
30368                              }
30369                              unsigned rm = ExtractQRegister(instr, 5, 0);
30370                              // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30371                              vbit(CurrentCond(),
30372                                   kDataTypeValueNone,
30373                                   QRegister(rd),
30374                                   QRegister(rn),
30375                                   QRegister(rm));
30376                              break;
30377                            }
30378                            case 0x10300000: {
30379                              // 0xff300150
30380                              if (((instr >> 12) & 1) != 0) {
30381                                UnallocatedT32(instr);
30382                                return;
30383                              }
30384                              unsigned rd = ExtractQRegister(instr, 22, 12);
30385                              if (((instr >> 16) & 1) != 0) {
30386                                UnallocatedT32(instr);
30387                                return;
30388                              }
30389                              unsigned rn = ExtractQRegister(instr, 7, 16);
30390                              if ((instr & 1) != 0) {
30391                                UnallocatedT32(instr);
30392                                return;
30393                              }
30394                              unsigned rm = ExtractQRegister(instr, 5, 0);
30395                              // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30396                              vbif(CurrentCond(),
30397                                   kDataTypeValueNone,
30398                                   QRegister(rd),
30399                                   QRegister(rn),
30400                                   QRegister(rm));
30401                              break;
30402                            }
30403                          }
30404                          break;
30405                        }
30406                        case 0x00000200: {
30407                          // 0xef000250
30408                          DataType dt = Dt_U_size_3_Decode(
30409                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30410                          if (dt.Is(kDataTypeValueInvalid)) {
30411                            UnallocatedT32(instr);
30412                            return;
30413                          }
30414                          if (((instr >> 12) & 1) != 0) {
30415                            UnallocatedT32(instr);
30416                            return;
30417                          }
30418                          unsigned rd = ExtractQRegister(instr, 22, 12);
30419                          if (((instr >> 16) & 1) != 0) {
30420                            UnallocatedT32(instr);
30421                            return;
30422                          }
30423                          unsigned rn = ExtractQRegister(instr, 7, 16);
30424                          if ((instr & 1) != 0) {
30425                            UnallocatedT32(instr);
30426                            return;
30427                          }
30428                          unsigned rm = ExtractQRegister(instr, 5, 0);
30429                          // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30430                          vqsub(CurrentCond(),
30431                                dt,
30432                                QRegister(rd),
30433                                QRegister(rn),
30434                                QRegister(rm));
30435                          break;
30436                        }
30437                        case 0x00000300: {
30438                          // 0xef000350
30439                          DataType dt = Dt_U_size_1_Decode(
30440                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30441                          if (dt.Is(kDataTypeValueInvalid)) {
30442                            UnallocatedT32(instr);
30443                            return;
30444                          }
30445                          if (((instr >> 12) & 1) != 0) {
30446                            UnallocatedT32(instr);
30447                            return;
30448                          }
30449                          unsigned rd = ExtractQRegister(instr, 22, 12);
30450                          if (((instr >> 16) & 1) != 0) {
30451                            UnallocatedT32(instr);
30452                            return;
30453                          }
30454                          unsigned rn = ExtractQRegister(instr, 7, 16);
30455                          if ((instr & 1) != 0) {
30456                            UnallocatedT32(instr);
30457                            return;
30458                          }
30459                          unsigned rm = ExtractQRegister(instr, 5, 0);
30460                          // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30461                          vcge(CurrentCond(),
30462                               dt,
30463                               QRegister(rd),
30464                               QRegister(rn),
30465                               QRegister(rm));
30466                          break;
30467                        }
30468                        case 0x00000400: {
30469                          // 0xef000450
30470                          DataType dt = Dt_U_size_3_Decode(
30471                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30472                          if (dt.Is(kDataTypeValueInvalid)) {
30473                            UnallocatedT32(instr);
30474                            return;
30475                          }
30476                          if (((instr >> 12) & 1) != 0) {
30477                            UnallocatedT32(instr);
30478                            return;
30479                          }
30480                          unsigned rd = ExtractQRegister(instr, 22, 12);
30481                          if ((instr & 1) != 0) {
30482                            UnallocatedT32(instr);
30483                            return;
30484                          }
30485                          unsigned rm = ExtractQRegister(instr, 5, 0);
30486                          if (((instr >> 16) & 1) != 0) {
30487                            UnallocatedT32(instr);
30488                            return;
30489                          }
30490                          unsigned rn = ExtractQRegister(instr, 7, 16);
30491                          // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
30492                          vqshl(CurrentCond(),
30493                                dt,
30494                                QRegister(rd),
30495                                QRegister(rm),
30496                                QRegister(rn));
30497                          break;
30498                        }
30499                        case 0x00000500: {
30500                          // 0xef000550
30501                          DataType dt = Dt_U_size_3_Decode(
30502                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30503                          if (dt.Is(kDataTypeValueInvalid)) {
30504                            UnallocatedT32(instr);
30505                            return;
30506                          }
30507                          if (((instr >> 12) & 1) != 0) {
30508                            UnallocatedT32(instr);
30509                            return;
30510                          }
30511                          unsigned rd = ExtractQRegister(instr, 22, 12);
30512                          if ((instr & 1) != 0) {
30513                            UnallocatedT32(instr);
30514                            return;
30515                          }
30516                          unsigned rm = ExtractQRegister(instr, 5, 0);
30517                          if (((instr >> 16) & 1) != 0) {
30518                            UnallocatedT32(instr);
30519                            return;
30520                          }
30521                          unsigned rn = ExtractQRegister(instr, 7, 16);
30522                          // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
30523                          vqrshl(CurrentCond(),
30524                                 dt,
30525                                 QRegister(rd),
30526                                 QRegister(rm),
30527                                 QRegister(rn));
30528                          break;
30529                        }
30530                        case 0x00000600: {
30531                          // 0xef000650
30532                          DataType dt = Dt_U_size_1_Decode(
30533                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30534                          if (dt.Is(kDataTypeValueInvalid)) {
30535                            UnallocatedT32(instr);
30536                            return;
30537                          }
30538                          if (((instr >> 12) & 1) != 0) {
30539                            UnallocatedT32(instr);
30540                            return;
30541                          }
30542                          unsigned rd = ExtractQRegister(instr, 22, 12);
30543                          if (((instr >> 16) & 1) != 0) {
30544                            UnallocatedT32(instr);
30545                            return;
30546                          }
30547                          unsigned rn = ExtractQRegister(instr, 7, 16);
30548                          if ((instr & 1) != 0) {
30549                            UnallocatedT32(instr);
30550                            return;
30551                          }
30552                          unsigned rm = ExtractQRegister(instr, 5, 0);
30553                          // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30554                          vmin(CurrentCond(),
30555                               dt,
30556                               QRegister(rd),
30557                               QRegister(rn),
30558                               QRegister(rm));
30559                          break;
30560                        }
30561                        case 0x00000700: {
30562                          // 0xef000750
30563                          DataType dt = Dt_U_size_1_Decode(
30564                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30565                          if (dt.Is(kDataTypeValueInvalid)) {
30566                            UnallocatedT32(instr);
30567                            return;
30568                          }
30569                          if (((instr >> 12) & 1) != 0) {
30570                            UnallocatedT32(instr);
30571                            return;
30572                          }
30573                          unsigned rd = ExtractQRegister(instr, 22, 12);
30574                          if (((instr >> 16) & 1) != 0) {
30575                            UnallocatedT32(instr);
30576                            return;
30577                          }
30578                          unsigned rn = ExtractQRegister(instr, 7, 16);
30579                          if ((instr & 1) != 0) {
30580                            UnallocatedT32(instr);
30581                            return;
30582                          }
30583                          unsigned rm = ExtractQRegister(instr, 5, 0);
30584                          // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; T1
30585                          vaba(CurrentCond(),
30586                               dt,
30587                               QRegister(rd),
30588                               QRegister(rn),
30589                               QRegister(rm));
30590                          break;
30591                        }
30592                        case 0x00000800: {
30593                          // 0xef000850
30594                          switch (instr & 0x10000000) {
30595                            case 0x00000000: {
30596                              // 0xef000850
30597                              DataType dt =
30598                                  Dt_size_7_Decode((instr >> 20) & 0x3);
30599                              if (dt.Is(kDataTypeValueInvalid)) {
30600                                UnallocatedT32(instr);
30601                                return;
30602                              }
30603                              if (((instr >> 12) & 1) != 0) {
30604                                UnallocatedT32(instr);
30605                                return;
30606                              }
30607                              unsigned rd = ExtractQRegister(instr, 22, 12);
30608                              if (((instr >> 16) & 1) != 0) {
30609                                UnallocatedT32(instr);
30610                                return;
30611                              }
30612                              unsigned rn = ExtractQRegister(instr, 7, 16);
30613                              if ((instr & 1) != 0) {
30614                                UnallocatedT32(instr);
30615                                return;
30616                              }
30617                              unsigned rm = ExtractQRegister(instr, 5, 0);
30618                              // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30619                              vtst(CurrentCond(),
30620                                   dt,
30621                                   QRegister(rd),
30622                                   QRegister(rn),
30623                                   QRegister(rm));
30624                              break;
30625                            }
30626                            case 0x10000000: {
30627                              // 0xff000850
30628                              DataType dt =
30629                                  Dt_size_4_Decode((instr >> 20) & 0x3);
30630                              if (dt.Is(kDataTypeValueInvalid)) {
30631                                UnallocatedT32(instr);
30632                                return;
30633                              }
30634                              if (((instr >> 12) & 1) != 0) {
30635                                UnallocatedT32(instr);
30636                                return;
30637                              }
30638                              unsigned rd = ExtractQRegister(instr, 22, 12);
30639                              if (((instr >> 16) & 1) != 0) {
30640                                UnallocatedT32(instr);
30641                                return;
30642                              }
30643                              unsigned rn = ExtractQRegister(instr, 7, 16);
30644                              if ((instr & 1) != 0) {
30645                                UnallocatedT32(instr);
30646                                return;
30647                              }
30648                              unsigned rm = ExtractQRegister(instr, 5, 0);
30649                              // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30650                              vceq(CurrentCond(),
30651                                   dt,
30652                                   QRegister(rd),
30653                                   QRegister(rn),
30654                                   QRegister(rm));
30655                              break;
30656                            }
30657                          }
30658                          break;
30659                        }
30660                        case 0x00000900: {
30661                          // 0xef000950
30662                          DataType dt = Dt_op_size_1_Decode(
30663                              ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30664                          if (dt.Is(kDataTypeValueInvalid)) {
30665                            UnallocatedT32(instr);
30666                            return;
30667                          }
30668                          if (((instr >> 12) & 1) != 0) {
30669                            UnallocatedT32(instr);
30670                            return;
30671                          }
30672                          unsigned rd = ExtractQRegister(instr, 22, 12);
30673                          if (((instr >> 16) & 1) != 0) {
30674                            UnallocatedT32(instr);
30675                            return;
30676                          }
30677                          unsigned rn = ExtractQRegister(instr, 7, 16);
30678                          if ((instr & 1) != 0) {
30679                            UnallocatedT32(instr);
30680                            return;
30681                          }
30682                          unsigned rm = ExtractQRegister(instr, 5, 0);
30683                          // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30684                          vmul(CurrentCond(),
30685                               dt,
30686                               QRegister(rd),
30687                               QRegister(rn),
30688                               QRegister(rm));
30689                          break;
30690                        }
30691                        case 0x00000c00: {
30692                          // 0xef000c50
30693                          switch (instr & 0x10300000) {
30694                            case 0x00000000: {
30695                              // 0xef000c50
30696                              if (((instr >> 12) & 1) != 0) {
30697                                UnallocatedT32(instr);
30698                                return;
30699                              }
30700                              unsigned rd = ExtractQRegister(instr, 22, 12);
30701                              if (((instr >> 16) & 1) != 0) {
30702                                UnallocatedT32(instr);
30703                                return;
30704                              }
30705                              unsigned rn = ExtractQRegister(instr, 7, 16);
30706                              if ((instr & 1) != 0) {
30707                                UnallocatedT32(instr);
30708                                return;
30709                              }
30710                              unsigned rm = ExtractQRegister(instr, 5, 0);
30711                              // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30712                              vfma(CurrentCond(),
30713                                   F32,
30714                                   QRegister(rd),
30715                                   QRegister(rn),
30716                                   QRegister(rm));
30717                              break;
30718                            }
30719                            case 0x00200000: {
30720                              // 0xef200c50
30721                              if (((instr >> 12) & 1) != 0) {
30722                                UnallocatedT32(instr);
30723                                return;
30724                              }
30725                              unsigned rd = ExtractQRegister(instr, 22, 12);
30726                              if (((instr >> 16) & 1) != 0) {
30727                                UnallocatedT32(instr);
30728                                return;
30729                              }
30730                              unsigned rn = ExtractQRegister(instr, 7, 16);
30731                              if ((instr & 1) != 0) {
30732                                UnallocatedT32(instr);
30733                                return;
30734                              }
30735                              unsigned rm = ExtractQRegister(instr, 5, 0);
30736                              // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30737                              vfms(CurrentCond(),
30738                                   F32,
30739                                   QRegister(rd),
30740                                   QRegister(rn),
30741                                   QRegister(rm));
30742                              break;
30743                            }
30744                            default:
30745                              UnallocatedT32(instr);
30746                              break;
30747                          }
30748                          break;
30749                        }
30750                        case 0x00000d00: {
30751                          // 0xef000d50
30752                          switch (instr & 0x10300000) {
30753                            case 0x00000000: {
30754                              // 0xef000d50
30755                              if (((instr >> 12) & 1) != 0) {
30756                                UnallocatedT32(instr);
30757                                return;
30758                              }
30759                              unsigned rd = ExtractQRegister(instr, 22, 12);
30760                              if (((instr >> 16) & 1) != 0) {
30761                                UnallocatedT32(instr);
30762                                return;
30763                              }
30764                              unsigned rn = ExtractQRegister(instr, 7, 16);
30765                              if ((instr & 1) != 0) {
30766                                UnallocatedT32(instr);
30767                                return;
30768                              }
30769                              unsigned rm = ExtractQRegister(instr, 5, 0);
30770                              // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30771                              vmla(CurrentCond(),
30772                                   F32,
30773                                   QRegister(rd),
30774                                   QRegister(rn),
30775                                   QRegister(rm));
30776                              break;
30777                            }
30778                            case 0x00200000: {
30779                              // 0xef200d50
30780                              if (((instr >> 12) & 1) != 0) {
30781                                UnallocatedT32(instr);
30782                                return;
30783                              }
30784                              unsigned rd = ExtractQRegister(instr, 22, 12);
30785                              if (((instr >> 16) & 1) != 0) {
30786                                UnallocatedT32(instr);
30787                                return;
30788                              }
30789                              unsigned rn = ExtractQRegister(instr, 7, 16);
30790                              if ((instr & 1) != 0) {
30791                                UnallocatedT32(instr);
30792                                return;
30793                              }
30794                              unsigned rm = ExtractQRegister(instr, 5, 0);
30795                              // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30796                              vmls(CurrentCond(),
30797                                   F32,
30798                                   QRegister(rd),
30799                                   QRegister(rn),
30800                                   QRegister(rm));
30801                              break;
30802                            }
30803                            case 0x10000000: {
30804                              // 0xff000d50
30805                              if (((instr >> 12) & 1) != 0) {
30806                                UnallocatedT32(instr);
30807                                return;
30808                              }
30809                              unsigned rd = ExtractQRegister(instr, 22, 12);
30810                              if (((instr >> 16) & 1) != 0) {
30811                                UnallocatedT32(instr);
30812                                return;
30813                              }
30814                              unsigned rn = ExtractQRegister(instr, 7, 16);
30815                              if ((instr & 1) != 0) {
30816                                UnallocatedT32(instr);
30817                                return;
30818                              }
30819                              unsigned rm = ExtractQRegister(instr, 5, 0);
30820                              // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30821                              vmul(CurrentCond(),
30822                                   F32,
30823                                   QRegister(rd),
30824                                   QRegister(rn),
30825                                   QRegister(rm));
30826                              break;
30827                            }
30828                            default:
30829                              UnallocatedT32(instr);
30830                              break;
30831                          }
30832                          break;
30833                        }
30834                        case 0x00000e00: {
30835                          // 0xef000e50
30836                          switch (instr & 0x10300000) {
30837                            case 0x10000000: {
30838                              // 0xff000e50
30839                              if (((instr >> 12) & 1) != 0) {
30840                                UnallocatedT32(instr);
30841                                return;
30842                              }
30843                              unsigned rd = ExtractQRegister(instr, 22, 12);
30844                              if (((instr >> 16) & 1) != 0) {
30845                                UnallocatedT32(instr);
30846                                return;
30847                              }
30848                              unsigned rn = ExtractQRegister(instr, 7, 16);
30849                              if ((instr & 1) != 0) {
30850                                UnallocatedT32(instr);
30851                                return;
30852                              }
30853                              unsigned rm = ExtractQRegister(instr, 5, 0);
30854                              // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30855                              vacge(CurrentCond(),
30856                                    F32,
30857                                    QRegister(rd),
30858                                    QRegister(rn),
30859                                    QRegister(rm));
30860                              break;
30861                            }
30862                            case 0x10200000: {
30863                              // 0xff200e50
30864                              if (((instr >> 12) & 1) != 0) {
30865                                UnallocatedT32(instr);
30866                                return;
30867                              }
30868                              unsigned rd = ExtractQRegister(instr, 22, 12);
30869                              if (((instr >> 16) & 1) != 0) {
30870                                UnallocatedT32(instr);
30871                                return;
30872                              }
30873                              unsigned rn = ExtractQRegister(instr, 7, 16);
30874                              if ((instr & 1) != 0) {
30875                                UnallocatedT32(instr);
30876                                return;
30877                              }
30878                              unsigned rm = ExtractQRegister(instr, 5, 0);
30879                              // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30880                              vacgt(CurrentCond(),
30881                                    F32,
30882                                    QRegister(rd),
30883                                    QRegister(rn),
30884                                    QRegister(rm));
30885                              break;
30886                            }
30887                            default:
30888                              UnallocatedT32(instr);
30889                              break;
30890                          }
30891                          break;
30892                        }
30893                        case 0x00000f00: {
30894                          // 0xef000f50
30895                          switch (instr & 0x10300000) {
30896                            case 0x00000000: {
30897                              // 0xef000f50
30898                              if (((instr >> 12) & 1) != 0) {
30899                                UnallocatedT32(instr);
30900                                return;
30901                              }
30902                              unsigned rd = ExtractQRegister(instr, 22, 12);
30903                              if (((instr >> 16) & 1) != 0) {
30904                                UnallocatedT32(instr);
30905                                return;
30906                              }
30907                              unsigned rn = ExtractQRegister(instr, 7, 16);
30908                              if ((instr & 1) != 0) {
30909                                UnallocatedT32(instr);
30910                                return;
30911                              }
30912                              unsigned rm = ExtractQRegister(instr, 5, 0);
30913                              // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30914                              vrecps(CurrentCond(),
30915                                     F32,
30916                                     QRegister(rd),
30917                                     QRegister(rn),
30918                                     QRegister(rm));
30919                              break;
30920                            }
30921                            case 0x00200000: {
30922                              // 0xef200f50
30923                              if (((instr >> 12) & 1) != 0) {
30924                                UnallocatedT32(instr);
30925                                return;
30926                              }
30927                              unsigned rd = ExtractQRegister(instr, 22, 12);
30928                              if (((instr >> 16) & 1) != 0) {
30929                                UnallocatedT32(instr);
30930                                return;
30931                              }
30932                              unsigned rn = ExtractQRegister(instr, 7, 16);
30933                              if ((instr & 1) != 0) {
30934                                UnallocatedT32(instr);
30935                                return;
30936                              }
30937                              unsigned rm = ExtractQRegister(instr, 5, 0);
30938                              // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
30939                              vrsqrts(CurrentCond(),
30940                                      F32,
30941                                      QRegister(rd),
30942                                      QRegister(rn),
30943                                      QRegister(rm));
30944                              break;
30945                            }
30946                            case 0x10000000: {
30947                              // 0xff000f50
30948                              if (((instr >> 12) & 1) != 0) {
30949                                UnallocatedT32(instr);
30950                                return;
30951                              }
30952                              unsigned rd = ExtractQRegister(instr, 22, 12);
30953                              if (((instr >> 16) & 1) != 0) {
30954                                UnallocatedT32(instr);
30955                                return;
30956                              }
30957                              unsigned rn = ExtractQRegister(instr, 7, 16);
30958                              if ((instr & 1) != 0) {
30959                                UnallocatedT32(instr);
30960                                return;
30961                              }
30962                              unsigned rm = ExtractQRegister(instr, 5, 0);
30963                              // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30964                              vmaxnm(F32,
30965                                     QRegister(rd),
30966                                     QRegister(rn),
30967                                     QRegister(rm));
30968                              if (InITBlock()) {
30969                                UnpredictableT32(instr);
30970                              }
30971                              break;
30972                            }
30973                            case 0x10200000: {
30974                              // 0xff200f50
30975                              if (((instr >> 12) & 1) != 0) {
30976                                UnallocatedT32(instr);
30977                                return;
30978                              }
30979                              unsigned rd = ExtractQRegister(instr, 22, 12);
30980                              if (((instr >> 16) & 1) != 0) {
30981                                UnallocatedT32(instr);
30982                                return;
30983                              }
30984                              unsigned rn = ExtractQRegister(instr, 7, 16);
30985                              if ((instr & 1) != 0) {
30986                                UnallocatedT32(instr);
30987                                return;
30988                              }
30989                              unsigned rm = ExtractQRegister(instr, 5, 0);
30990                              // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
30991                              vminnm(F32,
30992                                     QRegister(rd),
30993                                     QRegister(rn),
30994                                     QRegister(rm));
30995                              if (InITBlock()) {
30996                                UnpredictableT32(instr);
30997                              }
30998                              break;
30999                            }
31000                            default:
31001                              UnallocatedT32(instr);
31002                              break;
31003                          }
31004                          break;
31005                        }
31006                        default:
31007                          UnallocatedT32(instr);
31008                          break;
31009                      }
31010                      break;
31011                    }
31012                    case 0x00800000: {
31013                      // 0xef800010
31014                      switch (instr & 0x00000c00) {
31015                        case 0x00000000: {
31016                          // 0xef800010
31017                          switch (instr & 0x00380080) {
31018                            case 0x00000000: {
31019                              // 0xef800010
31020                              switch (instr & 0x00000100) {
31021                                case 0x00000000: {
31022                                  // 0xef800010
31023                                  switch (instr & 0x00000200) {
31024                                    default: {
31025                                      switch (instr & 0x00000020) {
31026                                        case 0x00000020: {
31027                                          // 0xef800030
31028                                          if (((instr & 0xd00) == 0x100) ||
31029                                              ((instr & 0xd00) == 0x500) ||
31030                                              ((instr & 0xd00) == 0x900) ||
31031                                              ((instr & 0xe00) == 0xe00)) {
31032                                            UnallocatedT32(instr);
31033                                            return;
31034                                          }
31035                                          unsigned cmode = (instr >> 8) & 0xf;
31036                                          DataType dt =
31037                                              ImmediateVmvn::DecodeDt(cmode);
31038                                          if (dt.Is(kDataTypeValueInvalid)) {
31039                                            UnallocatedT32(instr);
31040                                            return;
31041                                          }
31042                                          unsigned rd =
31043                                              ExtractDRegister(instr, 22, 12);
31044                                          DOperand imm =
31045                                              ImmediateVmvn::DecodeImmediate(
31046                                                  cmode,
31047                                                  (instr & 0xf) |
31048                                                      ((instr >> 12) & 0x70) |
31049                                                      ((instr >> 21) & 0x80));
31050                                          // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31051                                          vmvn(CurrentCond(),
31052                                               dt,
31053                                               DRegister(rd),
31054                                               imm);
31055                                          break;
31056                                        }
31057                                        default: {
31058                                          if (((instr & 0x920) == 0x100) ||
31059                                              ((instr & 0x520) == 0x100) ||
31060                                              ((instr & 0x820) == 0x20) ||
31061                                              ((instr & 0x420) == 0x20) ||
31062                                              ((instr & 0x220) == 0x20) ||
31063                                              ((instr & 0x120) == 0x120)) {
31064                                            UnallocatedT32(instr);
31065                                            return;
31066                                          }
31067                                          unsigned cmode =
31068                                              ((instr >> 8) & 0xf) |
31069                                              ((instr >> 1) & 0x10);
31070                                          DataType dt =
31071                                              ImmediateVmov::DecodeDt(cmode);
31072                                          if (dt.Is(kDataTypeValueInvalid)) {
31073                                            UnallocatedT32(instr);
31074                                            return;
31075                                          }
31076                                          unsigned rd =
31077                                              ExtractDRegister(instr, 22, 12);
31078                                          DOperand imm =
31079                                              ImmediateVmov::DecodeImmediate(
31080                                                  cmode,
31081                                                  (instr & 0xf) |
31082                                                      ((instr >> 12) & 0x70) |
31083                                                      ((instr >> 21) & 0x80));
31084                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31085                                          vmov(CurrentCond(),
31086                                               dt,
31087                                               DRegister(rd),
31088                                               imm);
31089                                          break;
31090                                        }
31091                                      }
31092                                      break;
31093                                    }
31094                                  }
31095                                  break;
31096                                }
31097                                case 0x00000100: {
31098                                  // 0xef800110
31099                                  switch (instr & 0x00000020) {
31100                                    case 0x00000000: {
31101                                      // 0xef800110
31102                                      if (((instr & 0x100) == 0x0) ||
31103                                          ((instr & 0xc00) == 0xc00)) {
31104                                        UnallocatedT32(instr);
31105                                        return;
31106                                      }
31107                                      unsigned cmode = (instr >> 8) & 0xf;
31108                                      DataType dt =
31109                                          ImmediateVorr::DecodeDt(cmode);
31110                                      if (dt.Is(kDataTypeValueInvalid)) {
31111                                        UnallocatedT32(instr);
31112                                        return;
31113                                      }
31114                                      unsigned rd =
31115                                          ExtractDRegister(instr, 22, 12);
31116                                      DOperand imm =
31117                                          ImmediateVorr::DecodeImmediate(
31118                                              cmode,
31119                                              (instr & 0xf) |
31120                                                  ((instr >> 12) & 0x70) |
31121                                                  ((instr >> 21) & 0x80));
31122                                      // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31123                                      vorr(CurrentCond(),
31124                                           dt,
31125                                           DRegister(rd),
31126                                           DRegister(rd),
31127                                           imm);
31128                                      break;
31129                                    }
31130                                    case 0x00000020: {
31131                                      // 0xef800130
31132                                      if (((instr & 0x100) == 0x0) ||
31133                                          ((instr & 0xc00) == 0xc00)) {
31134                                        UnallocatedT32(instr);
31135                                        return;
31136                                      }
31137                                      unsigned cmode = (instr >> 8) & 0xf;
31138                                      DataType dt =
31139                                          ImmediateVbic::DecodeDt(cmode);
31140                                      if (dt.Is(kDataTypeValueInvalid)) {
31141                                        UnallocatedT32(instr);
31142                                        return;
31143                                      }
31144                                      unsigned rd =
31145                                          ExtractDRegister(instr, 22, 12);
31146                                      DOperand imm =
31147                                          ImmediateVbic::DecodeImmediate(
31148                                              cmode,
31149                                              (instr & 0xf) |
31150                                                  ((instr >> 12) & 0x70) |
31151                                                  ((instr >> 21) & 0x80));
31152                                      // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31153                                      vbic(CurrentCond(),
31154                                           dt,
31155                                           DRegister(rd),
31156                                           DRegister(rd),
31157                                           imm);
31158                                      break;
31159                                    }
31160                                  }
31161                                  break;
31162                                }
31163                              }
31164                              break;
31165                            }
31166                            default: {
31167                              switch (instr & 0x00000300) {
31168                                case 0x00000000: {
31169                                  // 0xef800010
31170                                  if (((instr & 0x380080) == 0x0)) {
31171                                    UnallocatedT32(instr);
31172                                    return;
31173                                  }
31174                                  DataType dt =
31175                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31176                                                             ((instr >> 4) &
31177                                                              0x8),
31178                                                         (instr >> 28) & 0x1);
31179                                  if (dt.Is(kDataTypeValueInvalid)) {
31180                                    UnallocatedT32(instr);
31181                                    return;
31182                                  }
31183                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31184                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31185                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31186                                  uint32_t imm =
31187                                      (dt.IsSize(64) ? 64
31188                                                     : (dt.GetSize() * 2)) -
31189                                      imm6;
31190                                  // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31191                                  vshr(CurrentCond(),
31192                                       dt,
31193                                       DRegister(rd),
31194                                       DRegister(rm),
31195                                       imm);
31196                                  break;
31197                                }
31198                                case 0x00000100: {
31199                                  // 0xef800110
31200                                  if (((instr & 0x380080) == 0x0)) {
31201                                    UnallocatedT32(instr);
31202                                    return;
31203                                  }
31204                                  DataType dt =
31205                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31206                                                             ((instr >> 4) &
31207                                                              0x8),
31208                                                         (instr >> 28) & 0x1);
31209                                  if (dt.Is(kDataTypeValueInvalid)) {
31210                                    UnallocatedT32(instr);
31211                                    return;
31212                                  }
31213                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31214                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31215                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31216                                  uint32_t imm =
31217                                      (dt.IsSize(64) ? 64
31218                                                     : (dt.GetSize() * 2)) -
31219                                      imm6;
31220                                  // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31221                                  vsra(CurrentCond(),
31222                                       dt,
31223                                       DRegister(rd),
31224                                       DRegister(rm),
31225                                       imm);
31226                                  break;
31227                                }
31228                                case 0x00000200: {
31229                                  // 0xef800210
31230                                  if (((instr & 0x380080) == 0x0)) {
31231                                    UnallocatedT32(instr);
31232                                    return;
31233                                  }
31234                                  DataType dt =
31235                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31236                                                             ((instr >> 4) &
31237                                                              0x8),
31238                                                         (instr >> 28) & 0x1);
31239                                  if (dt.Is(kDataTypeValueInvalid)) {
31240                                    UnallocatedT32(instr);
31241                                    return;
31242                                  }
31243                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31244                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31245                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31246                                  uint32_t imm =
31247                                      (dt.IsSize(64) ? 64
31248                                                     : (dt.GetSize() * 2)) -
31249                                      imm6;
31250                                  // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31251                                  vrshr(CurrentCond(),
31252                                        dt,
31253                                        DRegister(rd),
31254                                        DRegister(rm),
31255                                        imm);
31256                                  break;
31257                                }
31258                                case 0x00000300: {
31259                                  // 0xef800310
31260                                  if (((instr & 0x380080) == 0x0)) {
31261                                    UnallocatedT32(instr);
31262                                    return;
31263                                  }
31264                                  DataType dt =
31265                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31266                                                             ((instr >> 4) &
31267                                                              0x8),
31268                                                         (instr >> 28) & 0x1);
31269                                  if (dt.Is(kDataTypeValueInvalid)) {
31270                                    UnallocatedT32(instr);
31271                                    return;
31272                                  }
31273                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31274                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31275                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31276                                  uint32_t imm =
31277                                      (dt.IsSize(64) ? 64
31278                                                     : (dt.GetSize() * 2)) -
31279                                      imm6;
31280                                  // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31281                                  vrsra(CurrentCond(),
31282                                        dt,
31283                                        DRegister(rd),
31284                                        DRegister(rm),
31285                                        imm);
31286                                  break;
31287                                }
31288                              }
31289                              break;
31290                            }
31291                          }
31292                          break;
31293                        }
31294                        case 0x00000400: {
31295                          // 0xef800410
31296                          switch (instr & 0x00380080) {
31297                            case 0x00000000: {
31298                              // 0xef800410
31299                              switch (instr & 0x00000100) {
31300                                case 0x00000000: {
31301                                  // 0xef800410
31302                                  switch (instr & 0x00000200) {
31303                                    default: {
31304                                      switch (instr & 0x00000020) {
31305                                        case 0x00000020: {
31306                                          // 0xef800430
31307                                          if (((instr & 0xd00) == 0x100) ||
31308                                              ((instr & 0xd00) == 0x500) ||
31309                                              ((instr & 0xd00) == 0x900) ||
31310                                              ((instr & 0xe00) == 0xe00)) {
31311                                            UnallocatedT32(instr);
31312                                            return;
31313                                          }
31314                                          unsigned cmode = (instr >> 8) & 0xf;
31315                                          DataType dt =
31316                                              ImmediateVmvn::DecodeDt(cmode);
31317                                          if (dt.Is(kDataTypeValueInvalid)) {
31318                                            UnallocatedT32(instr);
31319                                            return;
31320                                          }
31321                                          unsigned rd =
31322                                              ExtractDRegister(instr, 22, 12);
31323                                          DOperand imm =
31324                                              ImmediateVmvn::DecodeImmediate(
31325                                                  cmode,
31326                                                  (instr & 0xf) |
31327                                                      ((instr >> 12) & 0x70) |
31328                                                      ((instr >> 21) & 0x80));
31329                                          // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31330                                          vmvn(CurrentCond(),
31331                                               dt,
31332                                               DRegister(rd),
31333                                               imm);
31334                                          break;
31335                                        }
31336                                        default: {
31337                                          if (((instr & 0x920) == 0x100) ||
31338                                              ((instr & 0x520) == 0x100) ||
31339                                              ((instr & 0x820) == 0x20) ||
31340                                              ((instr & 0x420) == 0x20) ||
31341                                              ((instr & 0x220) == 0x20) ||
31342                                              ((instr & 0x120) == 0x120)) {
31343                                            UnallocatedT32(instr);
31344                                            return;
31345                                          }
31346                                          unsigned cmode =
31347                                              ((instr >> 8) & 0xf) |
31348                                              ((instr >> 1) & 0x10);
31349                                          DataType dt =
31350                                              ImmediateVmov::DecodeDt(cmode);
31351                                          if (dt.Is(kDataTypeValueInvalid)) {
31352                                            UnallocatedT32(instr);
31353                                            return;
31354                                          }
31355                                          unsigned rd =
31356                                              ExtractDRegister(instr, 22, 12);
31357                                          DOperand imm =
31358                                              ImmediateVmov::DecodeImmediate(
31359                                                  cmode,
31360                                                  (instr & 0xf) |
31361                                                      ((instr >> 12) & 0x70) |
31362                                                      ((instr >> 21) & 0x80));
31363                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31364                                          vmov(CurrentCond(),
31365                                               dt,
31366                                               DRegister(rd),
31367                                               imm);
31368                                          break;
31369                                        }
31370                                      }
31371                                      break;
31372                                    }
31373                                  }
31374                                  break;
31375                                }
31376                                case 0x00000100: {
31377                                  // 0xef800510
31378                                  switch (instr & 0x00000020) {
31379                                    case 0x00000000: {
31380                                      // 0xef800510
31381                                      if (((instr & 0x100) == 0x0) ||
31382                                          ((instr & 0xc00) == 0xc00)) {
31383                                        UnallocatedT32(instr);
31384                                        return;
31385                                      }
31386                                      unsigned cmode = (instr >> 8) & 0xf;
31387                                      DataType dt =
31388                                          ImmediateVorr::DecodeDt(cmode);
31389                                      if (dt.Is(kDataTypeValueInvalid)) {
31390                                        UnallocatedT32(instr);
31391                                        return;
31392                                      }
31393                                      unsigned rd =
31394                                          ExtractDRegister(instr, 22, 12);
31395                                      DOperand imm =
31396                                          ImmediateVorr::DecodeImmediate(
31397                                              cmode,
31398                                              (instr & 0xf) |
31399                                                  ((instr >> 12) & 0x70) |
31400                                                  ((instr >> 21) & 0x80));
31401                                      // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31402                                      vorr(CurrentCond(),
31403                                           dt,
31404                                           DRegister(rd),
31405                                           DRegister(rd),
31406                                           imm);
31407                                      break;
31408                                    }
31409                                    case 0x00000020: {
31410                                      // 0xef800530
31411                                      if (((instr & 0x100) == 0x0) ||
31412                                          ((instr & 0xc00) == 0xc00)) {
31413                                        UnallocatedT32(instr);
31414                                        return;
31415                                      }
31416                                      unsigned cmode = (instr >> 8) & 0xf;
31417                                      DataType dt =
31418                                          ImmediateVbic::DecodeDt(cmode);
31419                                      if (dt.Is(kDataTypeValueInvalid)) {
31420                                        UnallocatedT32(instr);
31421                                        return;
31422                                      }
31423                                      unsigned rd =
31424                                          ExtractDRegister(instr, 22, 12);
31425                                      DOperand imm =
31426                                          ImmediateVbic::DecodeImmediate(
31427                                              cmode,
31428                                              (instr & 0xf) |
31429                                                  ((instr >> 12) & 0x70) |
31430                                                  ((instr >> 21) & 0x80));
31431                                      // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31432                                      vbic(CurrentCond(),
31433                                           dt,
31434                                           DRegister(rd),
31435                                           DRegister(rd),
31436                                           imm);
31437                                      break;
31438                                    }
31439                                  }
31440                                  break;
31441                                }
31442                              }
31443                              break;
31444                            }
31445                            default: {
31446                              switch (instr & 0x00000300) {
31447                                case 0x00000000: {
31448                                  // 0xef800410
31449                                  if ((instr & 0x10000000) == 0x10000000) {
31450                                    if (((instr & 0x380080) == 0x0)) {
31451                                      UnallocatedT32(instr);
31452                                      return;
31453                                    }
31454                                    DataType dt = Dt_L_imm6_4_Decode(
31455                                        ((instr >> 19) & 0x7) |
31456                                        ((instr >> 4) & 0x8));
31457                                    if (dt.Is(kDataTypeValueInvalid)) {
31458                                      UnallocatedT32(instr);
31459                                      return;
31460                                    }
31461                                    unsigned rd =
31462                                        ExtractDRegister(instr, 22, 12);
31463                                    unsigned rm = ExtractDRegister(instr, 5, 0);
31464                                    uint32_t imm6 = (instr >> 16) & 0x3f;
31465                                    uint32_t imm =
31466                                        (dt.IsSize(64) ? 64
31467                                                       : (dt.GetSize() * 2)) -
31468                                        imm6;
31469                                    // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31470                                    vsri(CurrentCond(),
31471                                         dt,
31472                                         DRegister(rd),
31473                                         DRegister(rm),
31474                                         imm);
31475                                  } else {
31476                                    UnallocatedT32(instr);
31477                                  }
31478                                  break;
31479                                }
31480                                case 0x00000100: {
31481                                  // 0xef800510
31482                                  switch (instr & 0x10000000) {
31483                                    case 0x00000000: {
31484                                      // 0xef800510
31485                                      if (((instr & 0x380080) == 0x0)) {
31486                                        UnallocatedT32(instr);
31487                                        return;
31488                                      }
31489                                      DataType dt = Dt_L_imm6_3_Decode(
31490                                          ((instr >> 19) & 0x7) |
31491                                          ((instr >> 4) & 0x8));
31492                                      if (dt.Is(kDataTypeValueInvalid)) {
31493                                        UnallocatedT32(instr);
31494                                        return;
31495                                      }
31496                                      unsigned rd =
31497                                          ExtractDRegister(instr, 22, 12);
31498                                      unsigned rm =
31499                                          ExtractDRegister(instr, 5, 0);
31500                                      uint32_t imm6 = (instr >> 16) & 0x3f;
31501                                      uint32_t imm =
31502                                          imm6 -
31503                                          (dt.IsSize(64) ? 0 : dt.GetSize());
31504                                      // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31505                                      vshl(CurrentCond(),
31506                                           dt,
31507                                           DRegister(rd),
31508                                           DRegister(rm),
31509                                           imm);
31510                                      break;
31511                                    }
31512                                    case 0x10000000: {
31513                                      // 0xff800510
31514                                      if (((instr & 0x380080) == 0x0)) {
31515                                        UnallocatedT32(instr);
31516                                        return;
31517                                      }
31518                                      DataType dt = Dt_L_imm6_4_Decode(
31519                                          ((instr >> 19) & 0x7) |
31520                                          ((instr >> 4) & 0x8));
31521                                      if (dt.Is(kDataTypeValueInvalid)) {
31522                                        UnallocatedT32(instr);
31523                                        return;
31524                                      }
31525                                      unsigned rd =
31526                                          ExtractDRegister(instr, 22, 12);
31527                                      unsigned rm =
31528                                          ExtractDRegister(instr, 5, 0);
31529                                      uint32_t imm6 = (instr >> 16) & 0x3f;
31530                                      uint32_t imm =
31531                                          imm6 -
31532                                          (dt.IsSize(64) ? 0 : dt.GetSize());
31533                                      // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31534                                      vsli(CurrentCond(),
31535                                           dt,
31536                                           DRegister(rd),
31537                                           DRegister(rm),
31538                                           imm);
31539                                      break;
31540                                    }
31541                                  }
31542                                  break;
31543                                }
31544                                case 0x00000200: {
31545                                  // 0xef800610
31546                                  if (((instr & 0x380080) == 0x0)) {
31547                                    UnallocatedT32(instr);
31548                                    return;
31549                                  }
31550                                  DataType dt =
31551                                      Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
31552                                                             ((instr >> 4) &
31553                                                              0x8),
31554                                                         (instr >> 28) & 0x1);
31555                                  if (dt.Is(kDataTypeValueInvalid)) {
31556                                    UnallocatedT32(instr);
31557                                    return;
31558                                  }
31559                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31560                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31561                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31562                                  uint32_t imm =
31563                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
31564                                  // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31565                                  vqshlu(CurrentCond(),
31566                                         dt,
31567                                         DRegister(rd),
31568                                         DRegister(rm),
31569                                         imm);
31570                                  break;
31571                                }
31572                                case 0x00000300: {
31573                                  // 0xef800710
31574                                  if (((instr & 0x380080) == 0x0)) {
31575                                    UnallocatedT32(instr);
31576                                    return;
31577                                  }
31578                                  DataType dt =
31579                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31580                                                             ((instr >> 4) &
31581                                                              0x8),
31582                                                         (instr >> 28) & 0x1);
31583                                  if (dt.Is(kDataTypeValueInvalid)) {
31584                                    UnallocatedT32(instr);
31585                                    return;
31586                                  }
31587                                  unsigned rd = ExtractDRegister(instr, 22, 12);
31588                                  unsigned rm = ExtractDRegister(instr, 5, 0);
31589                                  uint32_t imm6 = (instr >> 16) & 0x3f;
31590                                  uint32_t imm =
31591                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
31592                                  // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31593                                  vqshl(CurrentCond(),
31594                                        dt,
31595                                        DRegister(rd),
31596                                        DRegister(rm),
31597                                        imm);
31598                                  break;
31599                                }
31600                              }
31601                              break;
31602                            }
31603                          }
31604                          break;
31605                        }
31606                        case 0x00000800: {
31607                          // 0xef800810
31608                          switch (instr & 0x00000080) {
31609                            case 0x00000000: {
31610                              // 0xef800810
31611                              switch (instr & 0x00380000) {
31612                                case 0x00000000: {
31613                                  // 0xef800810
31614                                  switch (instr & 0x00000100) {
31615                                    case 0x00000000: {
31616                                      // 0xef800810
31617                                      switch (instr & 0x00000200) {
31618                                        default: {
31619                                          switch (instr & 0x00000020) {
31620                                            case 0x00000020: {
31621                                              // 0xef800830
31622                                              if (((instr & 0xd00) == 0x100) ||
31623                                                  ((instr & 0xd00) == 0x500) ||
31624                                                  ((instr & 0xd00) == 0x900) ||
31625                                                  ((instr & 0xe00) == 0xe00)) {
31626                                                UnallocatedT32(instr);
31627                                                return;
31628                                              }
31629                                              unsigned cmode =
31630                                                  (instr >> 8) & 0xf;
31631                                              DataType dt =
31632                                                  ImmediateVmvn::DecodeDt(
31633                                                      cmode);
31634                                              if (dt.Is(
31635                                                      kDataTypeValueInvalid)) {
31636                                                UnallocatedT32(instr);
31637                                                return;
31638                                              }
31639                                              unsigned rd =
31640                                                  ExtractDRegister(instr,
31641                                                                   22,
31642                                                                   12);
31643                                              DOperand imm = ImmediateVmvn::
31644                                                  DecodeImmediate(cmode,
31645                                                                  (instr &
31646                                                                   0xf) |
31647                                                                      ((instr >>
31648                                                                        12) &
31649                                                                       0x70) |
31650                                                                      ((instr >>
31651                                                                        21) &
31652                                                                       0x80));
31653                                              // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31654                                              vmvn(CurrentCond(),
31655                                                   dt,
31656                                                   DRegister(rd),
31657                                                   imm);
31658                                              break;
31659                                            }
31660                                            default: {
31661                                              if (((instr & 0x920) == 0x100) ||
31662                                                  ((instr & 0x520) == 0x100) ||
31663                                                  ((instr & 0x820) == 0x20) ||
31664                                                  ((instr & 0x420) == 0x20) ||
31665                                                  ((instr & 0x220) == 0x20) ||
31666                                                  ((instr & 0x120) == 0x120)) {
31667                                                UnallocatedT32(instr);
31668                                                return;
31669                                              }
31670                                              unsigned cmode =
31671                                                  ((instr >> 8) & 0xf) |
31672                                                  ((instr >> 1) & 0x10);
31673                                              DataType dt =
31674                                                  ImmediateVmov::DecodeDt(
31675                                                      cmode);
31676                                              if (dt.Is(
31677                                                      kDataTypeValueInvalid)) {
31678                                                UnallocatedT32(instr);
31679                                                return;
31680                                              }
31681                                              unsigned rd =
31682                                                  ExtractDRegister(instr,
31683                                                                   22,
31684                                                                   12);
31685                                              DOperand imm = ImmediateVmov::
31686                                                  DecodeImmediate(cmode,
31687                                                                  (instr &
31688                                                                   0xf) |
31689                                                                      ((instr >>
31690                                                                        12) &
31691                                                                       0x70) |
31692                                                                      ((instr >>
31693                                                                        21) &
31694                                                                       0x80));
31695                                              // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31696                                              vmov(CurrentCond(),
31697                                                   dt,
31698                                                   DRegister(rd),
31699                                                   imm);
31700                                              break;
31701                                            }
31702                                          }
31703                                          break;
31704                                        }
31705                                      }
31706                                      break;
31707                                    }
31708                                    case 0x00000100: {
31709                                      // 0xef800910
31710                                      switch (instr & 0x00000020) {
31711                                        case 0x00000000: {
31712                                          // 0xef800910
31713                                          if (((instr & 0x100) == 0x0) ||
31714                                              ((instr & 0xc00) == 0xc00)) {
31715                                            UnallocatedT32(instr);
31716                                            return;
31717                                          }
31718                                          unsigned cmode = (instr >> 8) & 0xf;
31719                                          DataType dt =
31720                                              ImmediateVorr::DecodeDt(cmode);
31721                                          if (dt.Is(kDataTypeValueInvalid)) {
31722                                            UnallocatedT32(instr);
31723                                            return;
31724                                          }
31725                                          unsigned rd =
31726                                              ExtractDRegister(instr, 22, 12);
31727                                          DOperand imm =
31728                                              ImmediateVorr::DecodeImmediate(
31729                                                  cmode,
31730                                                  (instr & 0xf) |
31731                                                      ((instr >> 12) & 0x70) |
31732                                                      ((instr >> 21) & 0x80));
31733                                          // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31734                                          vorr(CurrentCond(),
31735                                               dt,
31736                                               DRegister(rd),
31737                                               DRegister(rd),
31738                                               imm);
31739                                          break;
31740                                        }
31741                                        case 0x00000020: {
31742                                          // 0xef800930
31743                                          if (((instr & 0x100) == 0x0) ||
31744                                              ((instr & 0xc00) == 0xc00)) {
31745                                            UnallocatedT32(instr);
31746                                            return;
31747                                          }
31748                                          unsigned cmode = (instr >> 8) & 0xf;
31749                                          DataType dt =
31750                                              ImmediateVbic::DecodeDt(cmode);
31751                                          if (dt.Is(kDataTypeValueInvalid)) {
31752                                            UnallocatedT32(instr);
31753                                            return;
31754                                          }
31755                                          unsigned rd =
31756                                              ExtractDRegister(instr, 22, 12);
31757                                          DOperand imm =
31758                                              ImmediateVbic::DecodeImmediate(
31759                                                  cmode,
31760                                                  (instr & 0xf) |
31761                                                      ((instr >> 12) & 0x70) |
31762                                                      ((instr >> 21) & 0x80));
31763                                          // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31764                                          vbic(CurrentCond(),
31765                                               dt,
31766                                               DRegister(rd),
31767                                               DRegister(rd),
31768                                               imm);
31769                                          break;
31770                                        }
31771                                      }
31772                                      break;
31773                                    }
31774                                  }
31775                                  break;
31776                                }
31777                                case 0x00180000: {
31778                                  // 0xef980810
31779                                  switch (instr & 0x00000300) {
31780                                    case 0x00000000: {
31781                                      // 0xef980810
31782                                      switch (instr & 0x10000000) {
31783                                        case 0x00000000: {
31784                                          // 0xef980810
31785                                          if (((instr & 0x380000) == 0x0)) {
31786                                            UnallocatedT32(instr);
31787                                            return;
31788                                          }
31789                                          DataType dt = Dt_imm6_3_Decode(
31790                                              (instr >> 19) & 0x7);
31791                                          if (dt.Is(kDataTypeValueInvalid)) {
31792                                            UnallocatedT32(instr);
31793                                            return;
31794                                          }
31795                                          unsigned rd =
31796                                              ExtractDRegister(instr, 22, 12);
31797                                          if ((instr & 1) != 0) {
31798                                            UnallocatedT32(instr);
31799                                            return;
31800                                          }
31801                                          unsigned rm =
31802                                              ExtractQRegister(instr, 5, 0);
31803                                          uint32_t imm6 = (instr >> 16) & 0x3f;
31804                                          uint32_t imm = dt.GetSize() - imm6;
31805                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31806                                          vshrn(CurrentCond(),
31807                                                dt,
31808                                                DRegister(rd),
31809                                                QRegister(rm),
31810                                                imm);
31811                                          break;
31812                                        }
31813                                        case 0x10000000: {
31814                                          // 0xff980810
31815                                          if (((instr & 0x380000) == 0x0)) {
31816                                            UnallocatedT32(instr);
31817                                            return;
31818                                          }
31819                                          DataType dt =
31820                                              Dt_imm6_2_Decode((instr >> 19) &
31821                                                                   0x7,
31822                                                               (instr >> 28) &
31823                                                                   0x1);
31824                                          if (dt.Is(kDataTypeValueInvalid)) {
31825                                            UnallocatedT32(instr);
31826                                            return;
31827                                          }
31828                                          unsigned rd =
31829                                              ExtractDRegister(instr, 22, 12);
31830                                          if ((instr & 1) != 0) {
31831                                            UnallocatedT32(instr);
31832                                            return;
31833                                          }
31834                                          unsigned rm =
31835                                              ExtractQRegister(instr, 5, 0);
31836                                          uint32_t imm6 = (instr >> 16) & 0x3f;
31837                                          uint32_t imm = dt.GetSize() - imm6;
31838                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31839                                          vqshrun(CurrentCond(),
31840                                                  dt,
31841                                                  DRegister(rd),
31842                                                  QRegister(rm),
31843                                                  imm);
31844                                          break;
31845                                        }
31846                                      }
31847                                      break;
31848                                    }
31849                                    case 0x00000100: {
31850                                      // 0xef980910
31851                                      if (((instr & 0x380000) == 0x0)) {
31852                                        UnallocatedT32(instr);
31853                                        return;
31854                                      }
31855                                      DataType dt =
31856                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
31857                                                           (instr >> 28) & 0x1);
31858                                      if (dt.Is(kDataTypeValueInvalid)) {
31859                                        UnallocatedT32(instr);
31860                                        return;
31861                                      }
31862                                      unsigned rd =
31863                                          ExtractDRegister(instr, 22, 12);
31864                                      if ((instr & 1) != 0) {
31865                                        UnallocatedT32(instr);
31866                                        return;
31867                                      }
31868                                      unsigned rm =
31869                                          ExtractQRegister(instr, 5, 0);
31870                                      uint32_t imm6 = (instr >> 16) & 0x3f;
31871                                      uint32_t imm = dt.GetSize() - imm6;
31872                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31873                                      vqshrn(CurrentCond(),
31874                                             dt,
31875                                             DRegister(rd),
31876                                             QRegister(rm),
31877                                             imm);
31878                                      break;
31879                                    }
31880                                    case 0x00000200: {
31881                                      // 0xef980a10
31882                                      if (((instr & 0x380000) == 0x0) ||
31883                                          ((instr & 0x3f0000) == 0x80000) ||
31884                                          ((instr & 0x3f0000) == 0x100000) ||
31885                                          ((instr & 0x3f0000) == 0x200000)) {
31886                                        UnallocatedT32(instr);
31887                                        return;
31888                                      }
31889                                      DataType dt =
31890                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
31891                                                           (instr >> 28) & 0x1);
31892                                      if (dt.Is(kDataTypeValueInvalid)) {
31893                                        UnallocatedT32(instr);
31894                                        return;
31895                                      }
31896                                      if (((instr >> 12) & 1) != 0) {
31897                                        UnallocatedT32(instr);
31898                                        return;
31899                                      }
31900                                      unsigned rd =
31901                                          ExtractQRegister(instr, 22, 12);
31902                                      unsigned rm =
31903                                          ExtractDRegister(instr, 5, 0);
31904                                      uint32_t imm6 = (instr >> 16) & 0x3f;
31905                                      uint32_t imm = imm6 - dt.GetSize();
31906                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31907                                      vshll(CurrentCond(),
31908                                            dt,
31909                                            QRegister(rd),
31910                                            DRegister(rm),
31911                                            imm);
31912                                      break;
31913                                    }
31914                                    default:
31915                                      UnallocatedT32(instr);
31916                                      break;
31917                                  }
31918                                  break;
31919                                }
31920                                case 0x00280000: {
31921                                  // 0xefa80810
31922                                  switch (instr & 0x00000300) {
31923                                    case 0x00000000: {
31924                                      // 0xefa80810
31925                                      switch (instr & 0x10000000) {
31926                                        case 0x00000000: {
31927                                          // 0xefa80810
31928                                          if (((instr & 0x380000) == 0x0)) {
31929                                            UnallocatedT32(instr);
31930                                            return;
31931                                          }
31932                                          DataType dt = Dt_imm6_3_Decode(
31933                                              (instr >> 19) & 0x7);
31934                                          if (dt.Is(kDataTypeValueInvalid)) {
31935                                            UnallocatedT32(instr);
31936                                            return;
31937                                          }
31938                                          unsigned rd =
31939                                              ExtractDRegister(instr, 22, 12);
31940                                          if ((instr & 1) != 0) {
31941                                            UnallocatedT32(instr);
31942                                            return;
31943                                          }
31944                                          unsigned rm =
31945                                              ExtractQRegister(instr, 5, 0);
31946                                          uint32_t imm6 = (instr >> 16) & 0x3f;
31947                                          uint32_t imm = dt.GetSize() - imm6;
31948                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31949                                          vshrn(CurrentCond(),
31950                                                dt,
31951                                                DRegister(rd),
31952                                                QRegister(rm),
31953                                                imm);
31954                                          break;
31955                                        }
31956                                        case 0x10000000: {
31957                                          // 0xffa80810
31958                                          if (((instr & 0x380000) == 0x0)) {
31959                                            UnallocatedT32(instr);
31960                                            return;
31961                                          }
31962                                          DataType dt =
31963                                              Dt_imm6_2_Decode((instr >> 19) &
31964                                                                   0x7,
31965                                                               (instr >> 28) &
31966                                                                   0x1);
31967                                          if (dt.Is(kDataTypeValueInvalid)) {
31968                                            UnallocatedT32(instr);
31969                                            return;
31970                                          }
31971                                          unsigned rd =
31972                                              ExtractDRegister(instr, 22, 12);
31973                                          if ((instr & 1) != 0) {
31974                                            UnallocatedT32(instr);
31975                                            return;
31976                                          }
31977                                          unsigned rm =
31978                                              ExtractQRegister(instr, 5, 0);
31979                                          uint32_t imm6 = (instr >> 16) & 0x3f;
31980                                          uint32_t imm = dt.GetSize() - imm6;
31981                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31982                                          vqshrun(CurrentCond(),
31983                                                  dt,
31984                                                  DRegister(rd),
31985                                                  QRegister(rm),
31986                                                  imm);
31987                                          break;
31988                                        }
31989                                      }
31990                                      break;
31991                                    }
31992                                    case 0x00000100: {
31993                                      // 0xefa80910
31994                                      if (((instr & 0x380000) == 0x0)) {
31995                                        UnallocatedT32(instr);
31996                                        return;
31997                                      }
31998                                      DataType dt =
31999                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
32000                                                           (instr >> 28) & 0x1);
32001                                      if (dt.Is(kDataTypeValueInvalid)) {
32002                                        UnallocatedT32(instr);
32003                                        return;
32004                                      }
32005                                      unsigned rd =
32006                                          ExtractDRegister(instr, 22, 12);
32007                                      if ((instr & 1) != 0) {
32008                                        UnallocatedT32(instr);
32009                                        return;
32010                                      }
32011                                      unsigned rm =
32012                                          ExtractQRegister(instr, 5, 0);
32013                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32014                                      uint32_t imm = dt.GetSize() - imm6;
32015                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32016                                      vqshrn(CurrentCond(),
32017                                             dt,
32018                                             DRegister(rd),
32019                                             QRegister(rm),
32020                                             imm);
32021                                      break;
32022                                    }
32023                                    case 0x00000200: {
32024                                      // 0xefa80a10
32025                                      if (((instr & 0x380000) == 0x0) ||
32026                                          ((instr & 0x3f0000) == 0x80000) ||
32027                                          ((instr & 0x3f0000) == 0x100000) ||
32028                                          ((instr & 0x3f0000) == 0x200000)) {
32029                                        UnallocatedT32(instr);
32030                                        return;
32031                                      }
32032                                      DataType dt =
32033                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
32034                                                           (instr >> 28) & 0x1);
32035                                      if (dt.Is(kDataTypeValueInvalid)) {
32036                                        UnallocatedT32(instr);
32037                                        return;
32038                                      }
32039                                      if (((instr >> 12) & 1) != 0) {
32040                                        UnallocatedT32(instr);
32041                                        return;
32042                                      }
32043                                      unsigned rd =
32044                                          ExtractQRegister(instr, 22, 12);
32045                                      unsigned rm =
32046                                          ExtractDRegister(instr, 5, 0);
32047                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32048                                      uint32_t imm = imm6 - dt.GetSize();
32049                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32050                                      vshll(CurrentCond(),
32051                                            dt,
32052                                            QRegister(rd),
32053                                            DRegister(rm),
32054                                            imm);
32055                                      break;
32056                                    }
32057                                    default:
32058                                      UnallocatedT32(instr);
32059                                      break;
32060                                  }
32061                                  break;
32062                                }
32063                                case 0x00300000: {
32064                                  // 0xefb00810
32065                                  switch (instr & 0x00000300) {
32066                                    case 0x00000000: {
32067                                      // 0xefb00810
32068                                      switch (instr & 0x10000000) {
32069                                        case 0x00000000: {
32070                                          // 0xefb00810
32071                                          if (((instr & 0x380000) == 0x0)) {
32072                                            UnallocatedT32(instr);
32073                                            return;
32074                                          }
32075                                          DataType dt = Dt_imm6_3_Decode(
32076                                              (instr >> 19) & 0x7);
32077                                          if (dt.Is(kDataTypeValueInvalid)) {
32078                                            UnallocatedT32(instr);
32079                                            return;
32080                                          }
32081                                          unsigned rd =
32082                                              ExtractDRegister(instr, 22, 12);
32083                                          if ((instr & 1) != 0) {
32084                                            UnallocatedT32(instr);
32085                                            return;
32086                                          }
32087                                          unsigned rm =
32088                                              ExtractQRegister(instr, 5, 0);
32089                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32090                                          uint32_t imm = dt.GetSize() - imm6;
32091                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32092                                          vshrn(CurrentCond(),
32093                                                dt,
32094                                                DRegister(rd),
32095                                                QRegister(rm),
32096                                                imm);
32097                                          break;
32098                                        }
32099                                        case 0x10000000: {
32100                                          // 0xffb00810
32101                                          if (((instr & 0x380000) == 0x0)) {
32102                                            UnallocatedT32(instr);
32103                                            return;
32104                                          }
32105                                          DataType dt =
32106                                              Dt_imm6_2_Decode((instr >> 19) &
32107                                                                   0x7,
32108                                                               (instr >> 28) &
32109                                                                   0x1);
32110                                          if (dt.Is(kDataTypeValueInvalid)) {
32111                                            UnallocatedT32(instr);
32112                                            return;
32113                                          }
32114                                          unsigned rd =
32115                                              ExtractDRegister(instr, 22, 12);
32116                                          if ((instr & 1) != 0) {
32117                                            UnallocatedT32(instr);
32118                                            return;
32119                                          }
32120                                          unsigned rm =
32121                                              ExtractQRegister(instr, 5, 0);
32122                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32123                                          uint32_t imm = dt.GetSize() - imm6;
32124                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32125                                          vqshrun(CurrentCond(),
32126                                                  dt,
32127                                                  DRegister(rd),
32128                                                  QRegister(rm),
32129                                                  imm);
32130                                          break;
32131                                        }
32132                                      }
32133                                      break;
32134                                    }
32135                                    case 0x00000100: {
32136                                      // 0xefb00910
32137                                      if (((instr & 0x380000) == 0x0)) {
32138                                        UnallocatedT32(instr);
32139                                        return;
32140                                      }
32141                                      DataType dt =
32142                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
32143                                                           (instr >> 28) & 0x1);
32144                                      if (dt.Is(kDataTypeValueInvalid)) {
32145                                        UnallocatedT32(instr);
32146                                        return;
32147                                      }
32148                                      unsigned rd =
32149                                          ExtractDRegister(instr, 22, 12);
32150                                      if ((instr & 1) != 0) {
32151                                        UnallocatedT32(instr);
32152                                        return;
32153                                      }
32154                                      unsigned rm =
32155                                          ExtractQRegister(instr, 5, 0);
32156                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32157                                      uint32_t imm = dt.GetSize() - imm6;
32158                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32159                                      vqshrn(CurrentCond(),
32160                                             dt,
32161                                             DRegister(rd),
32162                                             QRegister(rm),
32163                                             imm);
32164                                      break;
32165                                    }
32166                                    case 0x00000200: {
32167                                      // 0xefb00a10
32168                                      if (((instr & 0x380000) == 0x0) ||
32169                                          ((instr & 0x3f0000) == 0x80000) ||
32170                                          ((instr & 0x3f0000) == 0x100000) ||
32171                                          ((instr & 0x3f0000) == 0x200000)) {
32172                                        UnallocatedT32(instr);
32173                                        return;
32174                                      }
32175                                      DataType dt =
32176                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
32177                                                           (instr >> 28) & 0x1);
32178                                      if (dt.Is(kDataTypeValueInvalid)) {
32179                                        UnallocatedT32(instr);
32180                                        return;
32181                                      }
32182                                      if (((instr >> 12) & 1) != 0) {
32183                                        UnallocatedT32(instr);
32184                                        return;
32185                                      }
32186                                      unsigned rd =
32187                                          ExtractQRegister(instr, 22, 12);
32188                                      unsigned rm =
32189                                          ExtractDRegister(instr, 5, 0);
32190                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32191                                      uint32_t imm = imm6 - dt.GetSize();
32192                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32193                                      vshll(CurrentCond(),
32194                                            dt,
32195                                            QRegister(rd),
32196                                            DRegister(rm),
32197                                            imm);
32198                                      break;
32199                                    }
32200                                    default:
32201                                      UnallocatedT32(instr);
32202                                      break;
32203                                  }
32204                                  break;
32205                                }
32206                                case 0x00380000: {
32207                                  // 0xefb80810
32208                                  switch (instr & 0x00000300) {
32209                                    case 0x00000000: {
32210                                      // 0xefb80810
32211                                      switch (instr & 0x10000000) {
32212                                        case 0x00000000: {
32213                                          // 0xefb80810
32214                                          if (((instr & 0x380000) == 0x0)) {
32215                                            UnallocatedT32(instr);
32216                                            return;
32217                                          }
32218                                          DataType dt = Dt_imm6_3_Decode(
32219                                              (instr >> 19) & 0x7);
32220                                          if (dt.Is(kDataTypeValueInvalid)) {
32221                                            UnallocatedT32(instr);
32222                                            return;
32223                                          }
32224                                          unsigned rd =
32225                                              ExtractDRegister(instr, 22, 12);
32226                                          if ((instr & 1) != 0) {
32227                                            UnallocatedT32(instr);
32228                                            return;
32229                                          }
32230                                          unsigned rm =
32231                                              ExtractQRegister(instr, 5, 0);
32232                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32233                                          uint32_t imm = dt.GetSize() - imm6;
32234                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32235                                          vshrn(CurrentCond(),
32236                                                dt,
32237                                                DRegister(rd),
32238                                                QRegister(rm),
32239                                                imm);
32240                                          break;
32241                                        }
32242                                        case 0x10000000: {
32243                                          // 0xffb80810
32244                                          if (((instr & 0x380000) == 0x0)) {
32245                                            UnallocatedT32(instr);
32246                                            return;
32247                                          }
32248                                          DataType dt =
32249                                              Dt_imm6_2_Decode((instr >> 19) &
32250                                                                   0x7,
32251                                                               (instr >> 28) &
32252                                                                   0x1);
32253                                          if (dt.Is(kDataTypeValueInvalid)) {
32254                                            UnallocatedT32(instr);
32255                                            return;
32256                                          }
32257                                          unsigned rd =
32258                                              ExtractDRegister(instr, 22, 12);
32259                                          if ((instr & 1) != 0) {
32260                                            UnallocatedT32(instr);
32261                                            return;
32262                                          }
32263                                          unsigned rm =
32264                                              ExtractQRegister(instr, 5, 0);
32265                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32266                                          uint32_t imm = dt.GetSize() - imm6;
32267                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32268                                          vqshrun(CurrentCond(),
32269                                                  dt,
32270                                                  DRegister(rd),
32271                                                  QRegister(rm),
32272                                                  imm);
32273                                          break;
32274                                        }
32275                                      }
32276                                      break;
32277                                    }
32278                                    case 0x00000100: {
32279                                      // 0xefb80910
32280                                      if (((instr & 0x380000) == 0x0)) {
32281                                        UnallocatedT32(instr);
32282                                        return;
32283                                      }
32284                                      DataType dt =
32285                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
32286                                                           (instr >> 28) & 0x1);
32287                                      if (dt.Is(kDataTypeValueInvalid)) {
32288                                        UnallocatedT32(instr);
32289                                        return;
32290                                      }
32291                                      unsigned rd =
32292                                          ExtractDRegister(instr, 22, 12);
32293                                      if ((instr & 1) != 0) {
32294                                        UnallocatedT32(instr);
32295                                        return;
32296                                      }
32297                                      unsigned rm =
32298                                          ExtractQRegister(instr, 5, 0);
32299                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32300                                      uint32_t imm = dt.GetSize() - imm6;
32301                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32302                                      vqshrn(CurrentCond(),
32303                                             dt,
32304                                             DRegister(rd),
32305                                             QRegister(rm),
32306                                             imm);
32307                                      break;
32308                                    }
32309                                    case 0x00000200: {
32310                                      // 0xefb80a10
32311                                      if (((instr & 0x380000) == 0x0) ||
32312                                          ((instr & 0x3f0000) == 0x80000) ||
32313                                          ((instr & 0x3f0000) == 0x100000) ||
32314                                          ((instr & 0x3f0000) == 0x200000)) {
32315                                        UnallocatedT32(instr);
32316                                        return;
32317                                      }
32318                                      DataType dt =
32319                                          Dt_imm6_4_Decode((instr >> 19) & 0x7,
32320                                                           (instr >> 28) & 0x1);
32321                                      if (dt.Is(kDataTypeValueInvalid)) {
32322                                        UnallocatedT32(instr);
32323                                        return;
32324                                      }
32325                                      if (((instr >> 12) & 1) != 0) {
32326                                        UnallocatedT32(instr);
32327                                        return;
32328                                      }
32329                                      unsigned rd =
32330                                          ExtractQRegister(instr, 22, 12);
32331                                      unsigned rm =
32332                                          ExtractDRegister(instr, 5, 0);
32333                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32334                                      uint32_t imm = imm6 - dt.GetSize();
32335                                      // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32336                                      vshll(CurrentCond(),
32337                                            dt,
32338                                            QRegister(rd),
32339                                            DRegister(rm),
32340                                            imm);
32341                                      break;
32342                                    }
32343                                    default:
32344                                      UnallocatedT32(instr);
32345                                      break;
32346                                  }
32347                                  break;
32348                                }
32349                                default: {
32350                                  switch (instr & 0x00000300) {
32351                                    case 0x00000000: {
32352                                      // 0xef800810
32353                                      switch (instr & 0x10000000) {
32354                                        case 0x00000000: {
32355                                          // 0xef800810
32356                                          if (((instr & 0x380000) == 0x0)) {
32357                                            UnallocatedT32(instr);
32358                                            return;
32359                                          }
32360                                          DataType dt = Dt_imm6_3_Decode(
32361                                              (instr >> 19) & 0x7);
32362                                          if (dt.Is(kDataTypeValueInvalid)) {
32363                                            UnallocatedT32(instr);
32364                                            return;
32365                                          }
32366                                          unsigned rd =
32367                                              ExtractDRegister(instr, 22, 12);
32368                                          if ((instr & 1) != 0) {
32369                                            UnallocatedT32(instr);
32370                                            return;
32371                                          }
32372                                          unsigned rm =
32373                                              ExtractQRegister(instr, 5, 0);
32374                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32375                                          uint32_t imm = dt.GetSize() - imm6;
32376                                          // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32377                                          vshrn(CurrentCond(),
32378                                                dt,
32379                                                DRegister(rd),
32380                                                QRegister(rm),
32381                                                imm);
32382                                          break;
32383                                        }
32384                                        case 0x10000000: {
32385                                          // 0xff800810
32386                                          if (((instr & 0x380000) == 0x0)) {
32387                                            UnallocatedT32(instr);
32388                                            return;
32389                                          }
32390                                          DataType dt =
32391                                              Dt_imm6_2_Decode((instr >> 19) &
32392                                                                   0x7,
32393                                                               (instr >> 28) &
32394                                                                   0x1);
32395                                          if (dt.Is(kDataTypeValueInvalid)) {
32396                                            UnallocatedT32(instr);
32397                                            return;
32398                                          }
32399                                          unsigned rd =
32400                                              ExtractDRegister(instr, 22, 12);
32401                                          if ((instr & 1) != 0) {
32402                                            UnallocatedT32(instr);
32403                                            return;
32404                                          }
32405                                          unsigned rm =
32406                                              ExtractQRegister(instr, 5, 0);
32407                                          uint32_t imm6 = (instr >> 16) & 0x3f;
32408                                          uint32_t imm = dt.GetSize() - imm6;
32409                                          // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32410                                          vqshrun(CurrentCond(),
32411                                                  dt,
32412                                                  DRegister(rd),
32413                                                  QRegister(rm),
32414                                                  imm);
32415                                          break;
32416                                        }
32417                                      }
32418                                      break;
32419                                    }
32420                                    case 0x00000100: {
32421                                      // 0xef800910
32422                                      if (((instr & 0x380000) == 0x0)) {
32423                                        UnallocatedT32(instr);
32424                                        return;
32425                                      }
32426                                      DataType dt =
32427                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
32428                                                           (instr >> 28) & 0x1);
32429                                      if (dt.Is(kDataTypeValueInvalid)) {
32430                                        UnallocatedT32(instr);
32431                                        return;
32432                                      }
32433                                      unsigned rd =
32434                                          ExtractDRegister(instr, 22, 12);
32435                                      if ((instr & 1) != 0) {
32436                                        UnallocatedT32(instr);
32437                                        return;
32438                                      }
32439                                      unsigned rm =
32440                                          ExtractQRegister(instr, 5, 0);
32441                                      uint32_t imm6 = (instr >> 16) & 0x3f;
32442                                      uint32_t imm = dt.GetSize() - imm6;
32443                                      // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32444                                      vqshrn(CurrentCond(),
32445                                             dt,
32446                                             DRegister(rd),
32447                                             QRegister(rm),
32448                                             imm);
32449                                      break;
32450                                    }
32451                                    case 0x00000200: {
32452                                      // 0xef800a10
32453                                      switch (instr & 0x00070000) {
32454                                        case 0x00000000: {
32455                                          // 0xef800a10
32456                                          switch (instr & 0x003f0000) {
32457                                            case 0x00080000: {
32458                                              // 0xef880a10
32459                                              if (((instr & 0x380000) == 0x0) ||
32460                                                  ((instr & 0x380000) ==
32461                                                   0x180000) ||
32462                                                  ((instr & 0x380000) ==
32463                                                   0x280000) ||
32464                                                  ((instr & 0x380000) ==
32465                                                   0x300000) ||
32466                                                  ((instr & 0x380000) ==
32467                                                   0x380000)) {
32468                                                UnallocatedT32(instr);
32469                                                return;
32470                                              }
32471                                              DataType dt = Dt_U_imm3H_1_Decode(
32472                                                  ((instr >> 19) & 0x7) |
32473                                                  ((instr >> 25) & 0x8));
32474                                              if (dt.Is(
32475                                                      kDataTypeValueInvalid)) {
32476                                                UnallocatedT32(instr);
32477                                                return;
32478                                              }
32479                                              if (((instr >> 12) & 1) != 0) {
32480                                                UnallocatedT32(instr);
32481                                                return;
32482                                              }
32483                                              unsigned rd =
32484                                                  ExtractQRegister(instr,
32485                                                                   22,
32486                                                                   12);
32487                                              unsigned rm =
32488                                                  ExtractDRegister(instr, 5, 0);
32489                                              // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
32490                                              vmovl(CurrentCond(),
32491                                                    dt,
32492                                                    QRegister(rd),
32493                                                    DRegister(rm));
32494                                              break;
32495                                            }
32496                                            case 0x00090000: {
32497                                              // 0xef890a10
32498                                              if (((instr & 0x380000) == 0x0) ||
32499                                                  ((instr & 0x3f0000) ==
32500                                                   0x80000) ||
32501                                                  ((instr & 0x3f0000) ==
32502                                                   0x100000) ||
32503                                                  ((instr & 0x3f0000) ==
32504                                                   0x200000)) {
32505                                                UnallocatedT32(instr);
32506                                                return;
32507                                              }
32508                                              DataType dt =
32509                                                  Dt_imm6_4_Decode((instr >>
32510                                                                    19) &
32511                                                                       0x7,
32512                                                                   (instr >>
32513                                                                    28) &
32514                                                                       0x1);
32515                                              if (dt.Is(
32516                                                      kDataTypeValueInvalid)) {
32517                                                UnallocatedT32(instr);
32518                                                return;
32519                                              }
32520                                              if (((instr >> 12) & 1) != 0) {
32521                                                UnallocatedT32(instr);
32522                                                return;
32523                                              }
32524                                              unsigned rd =
32525                                                  ExtractQRegister(instr,
32526                                                                   22,
32527                                                                   12);
32528                                              unsigned rm =
32529                                                  ExtractDRegister(instr, 5, 0);
32530                                              uint32_t imm6 =
32531                                                  (instr >> 16) & 0x3f;
32532                                              uint32_t imm =
32533                                                  imm6 - dt.GetSize();
32534                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32535                                              vshll(CurrentCond(),
32536                                                    dt,
32537                                                    QRegister(rd),
32538                                                    DRegister(rm),
32539                                                    imm);
32540                                              break;
32541                                            }
32542                                            case 0x000a0000: {
32543                                              // 0xef8a0a10
32544                                              if (((instr & 0x380000) == 0x0) ||
32545                                                  ((instr & 0x3f0000) ==
32546                                                   0x80000) ||
32547                                                  ((instr & 0x3f0000) ==
32548                                                   0x100000) ||
32549                                                  ((instr & 0x3f0000) ==
32550                                                   0x200000)) {
32551                                                UnallocatedT32(instr);
32552                                                return;
32553                                              }
32554                                              DataType dt =
32555                                                  Dt_imm6_4_Decode((instr >>
32556                                                                    19) &
32557                                                                       0x7,
32558                                                                   (instr >>
32559                                                                    28) &
32560                                                                       0x1);
32561                                              if (dt.Is(
32562                                                      kDataTypeValueInvalid)) {
32563                                                UnallocatedT32(instr);
32564                                                return;
32565                                              }
32566                                              if (((instr >> 12) & 1) != 0) {
32567                                                UnallocatedT32(instr);
32568                                                return;
32569                                              }
32570                                              unsigned rd =
32571                                                  ExtractQRegister(instr,
32572                                                                   22,
32573                                                                   12);
32574                                              unsigned rm =
32575                                                  ExtractDRegister(instr, 5, 0);
32576                                              uint32_t imm6 =
32577                                                  (instr >> 16) & 0x3f;
32578                                              uint32_t imm =
32579                                                  imm6 - dt.GetSize();
32580                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32581                                              vshll(CurrentCond(),
32582                                                    dt,
32583                                                    QRegister(rd),
32584                                                    DRegister(rm),
32585                                                    imm);
32586                                              break;
32587                                            }
32588                                            case 0x000b0000: {
32589                                              // 0xef8b0a10
32590                                              if (((instr & 0x380000) == 0x0) ||
32591                                                  ((instr & 0x3f0000) ==
32592                                                   0x80000) ||
32593                                                  ((instr & 0x3f0000) ==
32594                                                   0x100000) ||
32595                                                  ((instr & 0x3f0000) ==
32596                                                   0x200000)) {
32597                                                UnallocatedT32(instr);
32598                                                return;
32599                                              }
32600                                              DataType dt =
32601                                                  Dt_imm6_4_Decode((instr >>
32602                                                                    19) &
32603                                                                       0x7,
32604                                                                   (instr >>
32605                                                                    28) &
32606                                                                       0x1);
32607                                              if (dt.Is(
32608                                                      kDataTypeValueInvalid)) {
32609                                                UnallocatedT32(instr);
32610                                                return;
32611                                              }
32612                                              if (((instr >> 12) & 1) != 0) {
32613                                                UnallocatedT32(instr);
32614                                                return;
32615                                              }
32616                                              unsigned rd =
32617                                                  ExtractQRegister(instr,
32618                                                                   22,
32619                                                                   12);
32620                                              unsigned rm =
32621                                                  ExtractDRegister(instr, 5, 0);
32622                                              uint32_t imm6 =
32623                                                  (instr >> 16) & 0x3f;
32624                                              uint32_t imm =
32625                                                  imm6 - dt.GetSize();
32626                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32627                                              vshll(CurrentCond(),
32628                                                    dt,
32629                                                    QRegister(rd),
32630                                                    DRegister(rm),
32631                                                    imm);
32632                                              break;
32633                                            }
32634                                            case 0x000c0000: {
32635                                              // 0xef8c0a10
32636                                              if (((instr & 0x380000) == 0x0) ||
32637                                                  ((instr & 0x3f0000) ==
32638                                                   0x80000) ||
32639                                                  ((instr & 0x3f0000) ==
32640                                                   0x100000) ||
32641                                                  ((instr & 0x3f0000) ==
32642                                                   0x200000)) {
32643                                                UnallocatedT32(instr);
32644                                                return;
32645                                              }
32646                                              DataType dt =
32647                                                  Dt_imm6_4_Decode((instr >>
32648                                                                    19) &
32649                                                                       0x7,
32650                                                                   (instr >>
32651                                                                    28) &
32652                                                                       0x1);
32653                                              if (dt.Is(
32654                                                      kDataTypeValueInvalid)) {
32655                                                UnallocatedT32(instr);
32656                                                return;
32657                                              }
32658                                              if (((instr >> 12) & 1) != 0) {
32659                                                UnallocatedT32(instr);
32660                                                return;
32661                                              }
32662                                              unsigned rd =
32663                                                  ExtractQRegister(instr,
32664                                                                   22,
32665                                                                   12);
32666                                              unsigned rm =
32667                                                  ExtractDRegister(instr, 5, 0);
32668                                              uint32_t imm6 =
32669                                                  (instr >> 16) & 0x3f;
32670                                              uint32_t imm =
32671                                                  imm6 - dt.GetSize();
32672                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32673                                              vshll(CurrentCond(),
32674                                                    dt,
32675                                                    QRegister(rd),
32676                                                    DRegister(rm),
32677                                                    imm);
32678                                              break;
32679                                            }
32680                                            case 0x000d0000: {
32681                                              // 0xef8d0a10
32682                                              if (((instr & 0x380000) == 0x0) ||
32683                                                  ((instr & 0x3f0000) ==
32684                                                   0x80000) ||
32685                                                  ((instr & 0x3f0000) ==
32686                                                   0x100000) ||
32687                                                  ((instr & 0x3f0000) ==
32688                                                   0x200000)) {
32689                                                UnallocatedT32(instr);
32690                                                return;
32691                                              }
32692                                              DataType dt =
32693                                                  Dt_imm6_4_Decode((instr >>
32694                                                                    19) &
32695                                                                       0x7,
32696                                                                   (instr >>
32697                                                                    28) &
32698                                                                       0x1);
32699                                              if (dt.Is(
32700                                                      kDataTypeValueInvalid)) {
32701                                                UnallocatedT32(instr);
32702                                                return;
32703                                              }
32704                                              if (((instr >> 12) & 1) != 0) {
32705                                                UnallocatedT32(instr);
32706                                                return;
32707                                              }
32708                                              unsigned rd =
32709                                                  ExtractQRegister(instr,
32710                                                                   22,
32711                                                                   12);
32712                                              unsigned rm =
32713                                                  ExtractDRegister(instr, 5, 0);
32714                                              uint32_t imm6 =
32715                                                  (instr >> 16) & 0x3f;
32716                                              uint32_t imm =
32717                                                  imm6 - dt.GetSize();
32718                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32719                                              vshll(CurrentCond(),
32720                                                    dt,
32721                                                    QRegister(rd),
32722                                                    DRegister(rm),
32723                                                    imm);
32724                                              break;
32725                                            }
32726                                            case 0x000e0000: {
32727                                              // 0xef8e0a10
32728                                              if (((instr & 0x380000) == 0x0) ||
32729                                                  ((instr & 0x3f0000) ==
32730                                                   0x80000) ||
32731                                                  ((instr & 0x3f0000) ==
32732                                                   0x100000) ||
32733                                                  ((instr & 0x3f0000) ==
32734                                                   0x200000)) {
32735                                                UnallocatedT32(instr);
32736                                                return;
32737                                              }
32738                                              DataType dt =
32739                                                  Dt_imm6_4_Decode((instr >>
32740                                                                    19) &
32741                                                                       0x7,
32742                                                                   (instr >>
32743                                                                    28) &
32744                                                                       0x1);
32745                                              if (dt.Is(
32746                                                      kDataTypeValueInvalid)) {
32747                                                UnallocatedT32(instr);
32748                                                return;
32749                                              }
32750                                              if (((instr >> 12) & 1) != 0) {
32751                                                UnallocatedT32(instr);
32752                                                return;
32753                                              }
32754                                              unsigned rd =
32755                                                  ExtractQRegister(instr,
32756                                                                   22,
32757                                                                   12);
32758                                              unsigned rm =
32759                                                  ExtractDRegister(instr, 5, 0);
32760                                              uint32_t imm6 =
32761                                                  (instr >> 16) & 0x3f;
32762                                              uint32_t imm =
32763                                                  imm6 - dt.GetSize();
32764                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32765                                              vshll(CurrentCond(),
32766                                                    dt,
32767                                                    QRegister(rd),
32768                                                    DRegister(rm),
32769                                                    imm);
32770                                              break;
32771                                            }
32772                                            case 0x000f0000: {
32773                                              // 0xef8f0a10
32774                                              if (((instr & 0x380000) == 0x0) ||
32775                                                  ((instr & 0x3f0000) ==
32776                                                   0x80000) ||
32777                                                  ((instr & 0x3f0000) ==
32778                                                   0x100000) ||
32779                                                  ((instr & 0x3f0000) ==
32780                                                   0x200000)) {
32781                                                UnallocatedT32(instr);
32782                                                return;
32783                                              }
32784                                              DataType dt =
32785                                                  Dt_imm6_4_Decode((instr >>
32786                                                                    19) &
32787                                                                       0x7,
32788                                                                   (instr >>
32789                                                                    28) &
32790                                                                       0x1);
32791                                              if (dt.Is(
32792                                                      kDataTypeValueInvalid)) {
32793                                                UnallocatedT32(instr);
32794                                                return;
32795                                              }
32796                                              if (((instr >> 12) & 1) != 0) {
32797                                                UnallocatedT32(instr);
32798                                                return;
32799                                              }
32800                                              unsigned rd =
32801                                                  ExtractQRegister(instr,
32802                                                                   22,
32803                                                                   12);
32804                                              unsigned rm =
32805                                                  ExtractDRegister(instr, 5, 0);
32806                                              uint32_t imm6 =
32807                                                  (instr >> 16) & 0x3f;
32808                                              uint32_t imm =
32809                                                  imm6 - dt.GetSize();
32810                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32811                                              vshll(CurrentCond(),
32812                                                    dt,
32813                                                    QRegister(rd),
32814                                                    DRegister(rm),
32815                                                    imm);
32816                                              break;
32817                                            }
32818                                            case 0x00100000: {
32819                                              // 0xef900a10
32820                                              if (((instr & 0x380000) == 0x0) ||
32821                                                  ((instr & 0x380000) ==
32822                                                   0x180000) ||
32823                                                  ((instr & 0x380000) ==
32824                                                   0x280000) ||
32825                                                  ((instr & 0x380000) ==
32826                                                   0x300000) ||
32827                                                  ((instr & 0x380000) ==
32828                                                   0x380000)) {
32829                                                UnallocatedT32(instr);
32830                                                return;
32831                                              }
32832                                              DataType dt = Dt_U_imm3H_1_Decode(
32833                                                  ((instr >> 19) & 0x7) |
32834                                                  ((instr >> 25) & 0x8));
32835                                              if (dt.Is(
32836                                                      kDataTypeValueInvalid)) {
32837                                                UnallocatedT32(instr);
32838                                                return;
32839                                              }
32840                                              if (((instr >> 12) & 1) != 0) {
32841                                                UnallocatedT32(instr);
32842                                                return;
32843                                              }
32844                                              unsigned rd =
32845                                                  ExtractQRegister(instr,
32846                                                                   22,
32847                                                                   12);
32848                                              unsigned rm =
32849                                                  ExtractDRegister(instr, 5, 0);
32850                                              // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
32851                                              vmovl(CurrentCond(),
32852                                                    dt,
32853                                                    QRegister(rd),
32854                                                    DRegister(rm));
32855                                              break;
32856                                            }
32857                                            case 0x00110000: {
32858                                              // 0xef910a10
32859                                              if (((instr & 0x380000) == 0x0) ||
32860                                                  ((instr & 0x3f0000) ==
32861                                                   0x80000) ||
32862                                                  ((instr & 0x3f0000) ==
32863                                                   0x100000) ||
32864                                                  ((instr & 0x3f0000) ==
32865                                                   0x200000)) {
32866                                                UnallocatedT32(instr);
32867                                                return;
32868                                              }
32869                                              DataType dt =
32870                                                  Dt_imm6_4_Decode((instr >>
32871                                                                    19) &
32872                                                                       0x7,
32873                                                                   (instr >>
32874                                                                    28) &
32875                                                                       0x1);
32876                                              if (dt.Is(
32877                                                      kDataTypeValueInvalid)) {
32878                                                UnallocatedT32(instr);
32879                                                return;
32880                                              }
32881                                              if (((instr >> 12) & 1) != 0) {
32882                                                UnallocatedT32(instr);
32883                                                return;
32884                                              }
32885                                              unsigned rd =
32886                                                  ExtractQRegister(instr,
32887                                                                   22,
32888                                                                   12);
32889                                              unsigned rm =
32890                                                  ExtractDRegister(instr, 5, 0);
32891                                              uint32_t imm6 =
32892                                                  (instr >> 16) & 0x3f;
32893                                              uint32_t imm =
32894                                                  imm6 - dt.GetSize();
32895                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32896                                              vshll(CurrentCond(),
32897                                                    dt,
32898                                                    QRegister(rd),
32899                                                    DRegister(rm),
32900                                                    imm);
32901                                              break;
32902                                            }
32903                                            case 0x00120000: {
32904                                              // 0xef920a10
32905                                              if (((instr & 0x380000) == 0x0) ||
32906                                                  ((instr & 0x3f0000) ==
32907                                                   0x80000) ||
32908                                                  ((instr & 0x3f0000) ==
32909                                                   0x100000) ||
32910                                                  ((instr & 0x3f0000) ==
32911                                                   0x200000)) {
32912                                                UnallocatedT32(instr);
32913                                                return;
32914                                              }
32915                                              DataType dt =
32916                                                  Dt_imm6_4_Decode((instr >>
32917                                                                    19) &
32918                                                                       0x7,
32919                                                                   (instr >>
32920                                                                    28) &
32921                                                                       0x1);
32922                                              if (dt.Is(
32923                                                      kDataTypeValueInvalid)) {
32924                                                UnallocatedT32(instr);
32925                                                return;
32926                                              }
32927                                              if (((instr >> 12) & 1) != 0) {
32928                                                UnallocatedT32(instr);
32929                                                return;
32930                                              }
32931                                              unsigned rd =
32932                                                  ExtractQRegister(instr,
32933                                                                   22,
32934                                                                   12);
32935                                              unsigned rm =
32936                                                  ExtractDRegister(instr, 5, 0);
32937                                              uint32_t imm6 =
32938                                                  (instr >> 16) & 0x3f;
32939                                              uint32_t imm =
32940                                                  imm6 - dt.GetSize();
32941                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32942                                              vshll(CurrentCond(),
32943                                                    dt,
32944                                                    QRegister(rd),
32945                                                    DRegister(rm),
32946                                                    imm);
32947                                              break;
32948                                            }
32949                                            case 0x00130000: {
32950                                              // 0xef930a10
32951                                              if (((instr & 0x380000) == 0x0) ||
32952                                                  ((instr & 0x3f0000) ==
32953                                                   0x80000) ||
32954                                                  ((instr & 0x3f0000) ==
32955                                                   0x100000) ||
32956                                                  ((instr & 0x3f0000) ==
32957                                                   0x200000)) {
32958                                                UnallocatedT32(instr);
32959                                                return;
32960                                              }
32961                                              DataType dt =
32962                                                  Dt_imm6_4_Decode((instr >>
32963                                                                    19) &
32964                                                                       0x7,
32965                                                                   (instr >>
32966                                                                    28) &
32967                                                                       0x1);
32968                                              if (dt.Is(
32969                                                      kDataTypeValueInvalid)) {
32970                                                UnallocatedT32(instr);
32971                                                return;
32972                                              }
32973                                              if (((instr >> 12) & 1) != 0) {
32974                                                UnallocatedT32(instr);
32975                                                return;
32976                                              }
32977                                              unsigned rd =
32978                                                  ExtractQRegister(instr,
32979                                                                   22,
32980                                                                   12);
32981                                              unsigned rm =
32982                                                  ExtractDRegister(instr, 5, 0);
32983                                              uint32_t imm6 =
32984                                                  (instr >> 16) & 0x3f;
32985                                              uint32_t imm =
32986                                                  imm6 - dt.GetSize();
32987                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32988                                              vshll(CurrentCond(),
32989                                                    dt,
32990                                                    QRegister(rd),
32991                                                    DRegister(rm),
32992                                                    imm);
32993                                              break;
32994                                            }
32995                                            case 0x00140000: {
32996                                              // 0xef940a10
32997                                              if (((instr & 0x380000) == 0x0) ||
32998                                                  ((instr & 0x3f0000) ==
32999                                                   0x80000) ||
33000                                                  ((instr & 0x3f0000) ==
33001                                                   0x100000) ||
33002                                                  ((instr & 0x3f0000) ==
33003                                                   0x200000)) {
33004                                                UnallocatedT32(instr);
33005                                                return;
33006                                              }
33007                                              DataType dt =
33008                                                  Dt_imm6_4_Decode((instr >>
33009                                                                    19) &
33010                                                                       0x7,
33011                                                                   (instr >>
33012                                                                    28) &
33013                                                                       0x1);
33014                                              if (dt.Is(
33015                                                      kDataTypeValueInvalid)) {
33016                                                UnallocatedT32(instr);
33017                                                return;
33018                                              }
33019                                              if (((instr >> 12) & 1) != 0) {
33020                                                UnallocatedT32(instr);
33021                                                return;
33022                                              }
33023                                              unsigned rd =
33024                                                  ExtractQRegister(instr,
33025                                                                   22,
33026                                                                   12);
33027                                              unsigned rm =
33028                                                  ExtractDRegister(instr, 5, 0);
33029                                              uint32_t imm6 =
33030                                                  (instr >> 16) & 0x3f;
33031                                              uint32_t imm =
33032                                                  imm6 - dt.GetSize();
33033                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33034                                              vshll(CurrentCond(),
33035                                                    dt,
33036                                                    QRegister(rd),
33037                                                    DRegister(rm),
33038                                                    imm);
33039                                              break;
33040                                            }
33041                                            case 0x00150000: {
33042                                              // 0xef950a10
33043                                              if (((instr & 0x380000) == 0x0) ||
33044                                                  ((instr & 0x3f0000) ==
33045                                                   0x80000) ||
33046                                                  ((instr & 0x3f0000) ==
33047                                                   0x100000) ||
33048                                                  ((instr & 0x3f0000) ==
33049                                                   0x200000)) {
33050                                                UnallocatedT32(instr);
33051                                                return;
33052                                              }
33053                                              DataType dt =
33054                                                  Dt_imm6_4_Decode((instr >>
33055                                                                    19) &
33056                                                                       0x7,
33057                                                                   (instr >>
33058                                                                    28) &
33059                                                                       0x1);
33060                                              if (dt.Is(
33061                                                      kDataTypeValueInvalid)) {
33062                                                UnallocatedT32(instr);
33063                                                return;
33064                                              }
33065                                              if (((instr >> 12) & 1) != 0) {
33066                                                UnallocatedT32(instr);
33067                                                return;
33068                                              }
33069                                              unsigned rd =
33070                                                  ExtractQRegister(instr,
33071                                                                   22,
33072                                                                   12);
33073                                              unsigned rm =
33074                                                  ExtractDRegister(instr, 5, 0);
33075                                              uint32_t imm6 =
33076                                                  (instr >> 16) & 0x3f;
33077                                              uint32_t imm =
33078                                                  imm6 - dt.GetSize();
33079                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33080                                              vshll(CurrentCond(),
33081                                                    dt,
33082                                                    QRegister(rd),
33083                                                    DRegister(rm),
33084                                                    imm);
33085                                              break;
33086                                            }
33087                                            case 0x00160000: {
33088                                              // 0xef960a10
33089                                              if (((instr & 0x380000) == 0x0) ||
33090                                                  ((instr & 0x3f0000) ==
33091                                                   0x80000) ||
33092                                                  ((instr & 0x3f0000) ==
33093                                                   0x100000) ||
33094                                                  ((instr & 0x3f0000) ==
33095                                                   0x200000)) {
33096                                                UnallocatedT32(instr);
33097                                                return;
33098                                              }
33099                                              DataType dt =
33100                                                  Dt_imm6_4_Decode((instr >>
33101                                                                    19) &
33102                                                                       0x7,
33103                                                                   (instr >>
33104                                                                    28) &
33105                                                                       0x1);
33106                                              if (dt.Is(
33107                                                      kDataTypeValueInvalid)) {
33108                                                UnallocatedT32(instr);
33109                                                return;
33110                                              }
33111                                              if (((instr >> 12) & 1) != 0) {
33112                                                UnallocatedT32(instr);
33113                                                return;
33114                                              }
33115                                              unsigned rd =
33116                                                  ExtractQRegister(instr,
33117                                                                   22,
33118                                                                   12);
33119                                              unsigned rm =
33120                                                  ExtractDRegister(instr, 5, 0);
33121                                              uint32_t imm6 =
33122                                                  (instr >> 16) & 0x3f;
33123                                              uint32_t imm =
33124                                                  imm6 - dt.GetSize();
33125                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33126                                              vshll(CurrentCond(),
33127                                                    dt,
33128                                                    QRegister(rd),
33129                                                    DRegister(rm),
33130                                                    imm);
33131                                              break;
33132                                            }
33133                                            case 0x00170000: {
33134                                              // 0xef970a10
33135                                              if (((instr & 0x380000) == 0x0) ||
33136                                                  ((instr & 0x3f0000) ==
33137                                                   0x80000) ||
33138                                                  ((instr & 0x3f0000) ==
33139                                                   0x100000) ||
33140                                                  ((instr & 0x3f0000) ==
33141                                                   0x200000)) {
33142                                                UnallocatedT32(instr);
33143                                                return;
33144                                              }
33145                                              DataType dt =
33146                                                  Dt_imm6_4_Decode((instr >>
33147                                                                    19) &
33148                                                                       0x7,
33149                                                                   (instr >>
33150                                                                    28) &
33151                                                                       0x1);
33152                                              if (dt.Is(
33153                                                      kDataTypeValueInvalid)) {
33154                                                UnallocatedT32(instr);
33155                                                return;
33156                                              }
33157                                              if (((instr >> 12) & 1) != 0) {
33158                                                UnallocatedT32(instr);
33159                                                return;
33160                                              }
33161                                              unsigned rd =
33162                                                  ExtractQRegister(instr,
33163                                                                   22,
33164                                                                   12);
33165                                              unsigned rm =
33166                                                  ExtractDRegister(instr, 5, 0);
33167                                              uint32_t imm6 =
33168                                                  (instr >> 16) & 0x3f;
33169                                              uint32_t imm =
33170                                                  imm6 - dt.GetSize();
33171                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33172                                              vshll(CurrentCond(),
33173                                                    dt,
33174                                                    QRegister(rd),
33175                                                    DRegister(rm),
33176                                                    imm);
33177                                              break;
33178                                            }
33179                                            case 0x00180000: {
33180                                              // 0xef980a10
33181                                              if (((instr & 0x380000) == 0x0) ||
33182                                                  ((instr & 0x3f0000) ==
33183                                                   0x80000) ||
33184                                                  ((instr & 0x3f0000) ==
33185                                                   0x100000) ||
33186                                                  ((instr & 0x3f0000) ==
33187                                                   0x200000)) {
33188                                                UnallocatedT32(instr);
33189                                                return;
33190                                              }
33191                                              DataType dt =
33192                                                  Dt_imm6_4_Decode((instr >>
33193                                                                    19) &
33194                                                                       0x7,
33195                                                                   (instr >>
33196                                                                    28) &
33197                                                                       0x1);
33198                                              if (dt.Is(
33199                                                      kDataTypeValueInvalid)) {
33200                                                UnallocatedT32(instr);
33201                                                return;
33202                                              }
33203                                              if (((instr >> 12) & 1) != 0) {
33204                                                UnallocatedT32(instr);
33205                                                return;
33206                                              }
33207                                              unsigned rd =
33208                                                  ExtractQRegister(instr,
33209                                                                   22,
33210                                                                   12);
33211                                              unsigned rm =
33212                                                  ExtractDRegister(instr, 5, 0);
33213                                              uint32_t imm6 =
33214                                                  (instr >> 16) & 0x3f;
33215                                              uint32_t imm =
33216                                                  imm6 - dt.GetSize();
33217                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33218                                              vshll(CurrentCond(),
33219                                                    dt,
33220                                                    QRegister(rd),
33221                                                    DRegister(rm),
33222                                                    imm);
33223                                              break;
33224                                            }
33225                                            case 0x00190000: {
33226                                              // 0xef990a10
33227                                              if (((instr & 0x380000) == 0x0) ||
33228                                                  ((instr & 0x3f0000) ==
33229                                                   0x80000) ||
33230                                                  ((instr & 0x3f0000) ==
33231                                                   0x100000) ||
33232                                                  ((instr & 0x3f0000) ==
33233                                                   0x200000)) {
33234                                                UnallocatedT32(instr);
33235                                                return;
33236                                              }
33237                                              DataType dt =
33238                                                  Dt_imm6_4_Decode((instr >>
33239                                                                    19) &
33240                                                                       0x7,
33241                                                                   (instr >>
33242                                                                    28) &
33243                                                                       0x1);
33244                                              if (dt.Is(
33245                                                      kDataTypeValueInvalid)) {
33246                                                UnallocatedT32(instr);
33247                                                return;
33248                                              }
33249                                              if (((instr >> 12) & 1) != 0) {
33250                                                UnallocatedT32(instr);
33251                                                return;
33252                                              }
33253                                              unsigned rd =
33254                                                  ExtractQRegister(instr,
33255                                                                   22,
33256                                                                   12);
33257                                              unsigned rm =
33258                                                  ExtractDRegister(instr, 5, 0);
33259                                              uint32_t imm6 =
33260                                                  (instr >> 16) & 0x3f;
33261                                              uint32_t imm =
33262                                                  imm6 - dt.GetSize();
33263                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33264                                              vshll(CurrentCond(),
33265                                                    dt,
33266                                                    QRegister(rd),
33267                                                    DRegister(rm),
33268                                                    imm);
33269                                              break;
33270                                            }
33271                                            case 0x001a0000: {
33272                                              // 0xef9a0a10
33273                                              if (((instr & 0x380000) == 0x0) ||
33274                                                  ((instr & 0x3f0000) ==
33275                                                   0x80000) ||
33276                                                  ((instr & 0x3f0000) ==
33277                                                   0x100000) ||
33278                                                  ((instr & 0x3f0000) ==
33279                                                   0x200000)) {
33280                                                UnallocatedT32(instr);
33281                                                return;
33282                                              }
33283                                              DataType dt =
33284                                                  Dt_imm6_4_Decode((instr >>
33285                                                                    19) &
33286                                                                       0x7,
33287                                                                   (instr >>
33288                                                                    28) &
33289                                                                       0x1);
33290                                              if (dt.Is(
33291                                                      kDataTypeValueInvalid)) {
33292                                                UnallocatedT32(instr);
33293                                                return;
33294                                              }
33295                                              if (((instr >> 12) & 1) != 0) {
33296                                                UnallocatedT32(instr);
33297                                                return;
33298                                              }
33299                                              unsigned rd =
33300                                                  ExtractQRegister(instr,
33301                                                                   22,
33302                                                                   12);
33303                                              unsigned rm =
33304                                                  ExtractDRegister(instr, 5, 0);
33305                                              uint32_t imm6 =
33306                                                  (instr >> 16) & 0x3f;
33307                                              uint32_t imm =
33308                                                  imm6 - dt.GetSize();
33309                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33310                                              vshll(CurrentCond(),
33311                                                    dt,
33312                                                    QRegister(rd),
33313                                                    DRegister(rm),
33314                                                    imm);
33315                                              break;
33316                                            }
33317                                            case 0x001b0000: {
33318                                              // 0xef9b0a10
33319                                              if (((instr & 0x380000) == 0x0) ||
33320                                                  ((instr & 0x3f0000) ==
33321                                                   0x80000) ||
33322                                                  ((instr & 0x3f0000) ==
33323                                                   0x100000) ||
33324                                                  ((instr & 0x3f0000) ==
33325                                                   0x200000)) {
33326                                                UnallocatedT32(instr);
33327                                                return;
33328                                              }
33329                                              DataType dt =
33330                                                  Dt_imm6_4_Decode((instr >>
33331                                                                    19) &
33332                                                                       0x7,
33333                                                                   (instr >>
33334                                                                    28) &
33335                                                                       0x1);
33336                                              if (dt.Is(
33337                                                      kDataTypeValueInvalid)) {
33338                                                UnallocatedT32(instr);
33339                                                return;
33340                                              }
33341                                              if (((instr >> 12) & 1) != 0) {
33342                                                UnallocatedT32(instr);
33343                                                return;
33344                                              }
33345                                              unsigned rd =
33346                                                  ExtractQRegister(instr,
33347                                                                   22,
33348                                                                   12);
33349                                              unsigned rm =
33350                                                  ExtractDRegister(instr, 5, 0);
33351                                              uint32_t imm6 =
33352                                                  (instr >> 16) & 0x3f;
33353                                              uint32_t imm =
33354                                                  imm6 - dt.GetSize();
33355                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33356                                              vshll(CurrentCond(),
33357                                                    dt,
33358                                                    QRegister(rd),
33359                                                    DRegister(rm),
33360                                                    imm);
33361                                              break;
33362                                            }
33363                                            case 0x001c0000: {
33364                                              // 0xef9c0a10
33365                                              if (((instr & 0x380000) == 0x0) ||
33366                                                  ((instr & 0x3f0000) ==
33367                                                   0x80000) ||
33368                                                  ((instr & 0x3f0000) ==
33369                                                   0x100000) ||
33370                                                  ((instr & 0x3f0000) ==
33371                                                   0x200000)) {
33372                                                UnallocatedT32(instr);
33373                                                return;
33374                                              }
33375                                              DataType dt =
33376                                                  Dt_imm6_4_Decode((instr >>
33377                                                                    19) &
33378                                                                       0x7,
33379                                                                   (instr >>
33380                                                                    28) &
33381                                                                       0x1);
33382                                              if (dt.Is(
33383                                                      kDataTypeValueInvalid)) {
33384                                                UnallocatedT32(instr);
33385                                                return;
33386                                              }
33387                                              if (((instr >> 12) & 1) != 0) {
33388                                                UnallocatedT32(instr);
33389                                                return;
33390                                              }
33391                                              unsigned rd =
33392                                                  ExtractQRegister(instr,
33393                                                                   22,
33394                                                                   12);
33395                                              unsigned rm =
33396                                                  ExtractDRegister(instr, 5, 0);
33397                                              uint32_t imm6 =
33398                                                  (instr >> 16) & 0x3f;
33399                                              uint32_t imm =
33400                                                  imm6 - dt.GetSize();
33401                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33402                                              vshll(CurrentCond(),
33403                                                    dt,
33404                                                    QRegister(rd),
33405                                                    DRegister(rm),
33406                                                    imm);
33407                                              break;
33408                                            }
33409                                            case 0x001d0000: {
33410                                              // 0xef9d0a10
33411                                              if (((instr & 0x380000) == 0x0) ||
33412                                                  ((instr & 0x3f0000) ==
33413                                                   0x80000) ||
33414                                                  ((instr & 0x3f0000) ==
33415                                                   0x100000) ||
33416                                                  ((instr & 0x3f0000) ==
33417                                                   0x200000)) {
33418                                                UnallocatedT32(instr);
33419                                                return;
33420                                              }
33421                                              DataType dt =
33422                                                  Dt_imm6_4_Decode((instr >>
33423                                                                    19) &
33424                                                                       0x7,
33425                                                                   (instr >>
33426                                                                    28) &
33427                                                                       0x1);
33428                                              if (dt.Is(
33429                                                      kDataTypeValueInvalid)) {
33430                                                UnallocatedT32(instr);
33431                                                return;
33432                                              }
33433                                              if (((instr >> 12) & 1) != 0) {
33434                                                UnallocatedT32(instr);
33435                                                return;
33436                                              }
33437                                              unsigned rd =
33438                                                  ExtractQRegister(instr,
33439                                                                   22,
33440                                                                   12);
33441                                              unsigned rm =
33442                                                  ExtractDRegister(instr, 5, 0);
33443                                              uint32_t imm6 =
33444                                                  (instr >> 16) & 0x3f;
33445                                              uint32_t imm =
33446                                                  imm6 - dt.GetSize();
33447                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33448                                              vshll(CurrentCond(),
33449                                                    dt,
33450                                                    QRegister(rd),
33451                                                    DRegister(rm),
33452                                                    imm);
33453                                              break;
33454                                            }
33455                                            case 0x001e0000: {
33456                                              // 0xef9e0a10
33457                                              if (((instr & 0x380000) == 0x0) ||
33458                                                  ((instr & 0x3f0000) ==
33459                                                   0x80000) ||
33460                                                  ((instr & 0x3f0000) ==
33461                                                   0x100000) ||
33462                                                  ((instr & 0x3f0000) ==
33463                                                   0x200000)) {
33464                                                UnallocatedT32(instr);
33465                                                return;
33466                                              }
33467                                              DataType dt =
33468                                                  Dt_imm6_4_Decode((instr >>
33469                                                                    19) &
33470                                                                       0x7,
33471                                                                   (instr >>
33472                                                                    28) &
33473                                                                       0x1);
33474                                              if (dt.Is(
33475                                                      kDataTypeValueInvalid)) {
33476                                                UnallocatedT32(instr);
33477                                                return;
33478                                              }
33479                                              if (((instr >> 12) & 1) != 0) {
33480                                                UnallocatedT32(instr);
33481                                                return;
33482                                              }
33483                                              unsigned rd =
33484                                                  ExtractQRegister(instr,
33485                                                                   22,
33486                                                                   12);
33487                                              unsigned rm =
33488                                                  ExtractDRegister(instr, 5, 0);
33489                                              uint32_t imm6 =
33490                                                  (instr >> 16) & 0x3f;
33491                                              uint32_t imm =
33492                                                  imm6 - dt.GetSize();
33493                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33494                                              vshll(CurrentCond(),
33495                                                    dt,
33496                                                    QRegister(rd),
33497                                                    DRegister(rm),
33498                                                    imm);
33499                                              break;
33500                                            }
33501                                            case 0x001f0000: {
33502                                              // 0xef9f0a10
33503                                              if (((instr & 0x380000) == 0x0) ||
33504                                                  ((instr & 0x3f0000) ==
33505                                                   0x80000) ||
33506                                                  ((instr & 0x3f0000) ==
33507                                                   0x100000) ||
33508                                                  ((instr & 0x3f0000) ==
33509                                                   0x200000)) {
33510                                                UnallocatedT32(instr);
33511                                                return;
33512                                              }
33513                                              DataType dt =
33514                                                  Dt_imm6_4_Decode((instr >>
33515                                                                    19) &
33516                                                                       0x7,
33517                                                                   (instr >>
33518                                                                    28) &
33519                                                                       0x1);
33520                                              if (dt.Is(
33521                                                      kDataTypeValueInvalid)) {
33522                                                UnallocatedT32(instr);
33523                                                return;
33524                                              }
33525                                              if (((instr >> 12) & 1) != 0) {
33526                                                UnallocatedT32(instr);
33527                                                return;
33528                                              }
33529                                              unsigned rd =
33530                                                  ExtractQRegister(instr,
33531                                                                   22,
33532                                                                   12);
33533                                              unsigned rm =
33534                                                  ExtractDRegister(instr, 5, 0);
33535                                              uint32_t imm6 =
33536                                                  (instr >> 16) & 0x3f;
33537                                              uint32_t imm =
33538                                                  imm6 - dt.GetSize();
33539                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33540                                              vshll(CurrentCond(),
33541                                                    dt,
33542                                                    QRegister(rd),
33543                                                    DRegister(rm),
33544                                                    imm);
33545                                              break;
33546                                            }
33547                                            case 0x00200000: {
33548                                              // 0xefa00a10
33549                                              if (((instr & 0x380000) == 0x0) ||
33550                                                  ((instr & 0x380000) ==
33551                                                   0x180000) ||
33552                                                  ((instr & 0x380000) ==
33553                                                   0x280000) ||
33554                                                  ((instr & 0x380000) ==
33555                                                   0x300000) ||
33556                                                  ((instr & 0x380000) ==
33557                                                   0x380000)) {
33558                                                UnallocatedT32(instr);
33559                                                return;
33560                                              }
33561                                              DataType dt = Dt_U_imm3H_1_Decode(
33562                                                  ((instr >> 19) & 0x7) |
33563                                                  ((instr >> 25) & 0x8));
33564                                              if (dt.Is(
33565                                                      kDataTypeValueInvalid)) {
33566                                                UnallocatedT32(instr);
33567                                                return;
33568                                              }
33569                                              if (((instr >> 12) & 1) != 0) {
33570                                                UnallocatedT32(instr);
33571                                                return;
33572                                              }
33573                                              unsigned rd =
33574                                                  ExtractQRegister(instr,
33575                                                                   22,
33576                                                                   12);
33577                                              unsigned rm =
33578                                                  ExtractDRegister(instr, 5, 0);
33579                                              // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
33580                                              vmovl(CurrentCond(),
33581                                                    dt,
33582                                                    QRegister(rd),
33583                                                    DRegister(rm));
33584                                              break;
33585                                            }
33586                                            case 0x00210000: {
33587                                              // 0xefa10a10
33588                                              if (((instr & 0x380000) == 0x0) ||
33589                                                  ((instr & 0x3f0000) ==
33590                                                   0x80000) ||
33591                                                  ((instr & 0x3f0000) ==
33592                                                   0x100000) ||
33593                                                  ((instr & 0x3f0000) ==
33594                                                   0x200000)) {
33595                                                UnallocatedT32(instr);
33596                                                return;
33597                                              }
33598                                              DataType dt =
33599                                                  Dt_imm6_4_Decode((instr >>
33600                                                                    19) &
33601                                                                       0x7,
33602                                                                   (instr >>
33603                                                                    28) &
33604                                                                       0x1);
33605                                              if (dt.Is(
33606                                                      kDataTypeValueInvalid)) {
33607                                                UnallocatedT32(instr);
33608                                                return;
33609                                              }
33610                                              if (((instr >> 12) & 1) != 0) {
33611                                                UnallocatedT32(instr);
33612                                                return;
33613                                              }
33614                                              unsigned rd =
33615                                                  ExtractQRegister(instr,
33616                                                                   22,
33617                                                                   12);
33618                                              unsigned rm =
33619                                                  ExtractDRegister(instr, 5, 0);
33620                                              uint32_t imm6 =
33621                                                  (instr >> 16) & 0x3f;
33622                                              uint32_t imm =
33623                                                  imm6 - dt.GetSize();
33624                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33625                                              vshll(CurrentCond(),
33626                                                    dt,
33627                                                    QRegister(rd),
33628                                                    DRegister(rm),
33629                                                    imm);
33630                                              break;
33631                                            }
33632                                            case 0x00220000: {
33633                                              // 0xefa20a10
33634                                              if (((instr & 0x380000) == 0x0) ||
33635                                                  ((instr & 0x3f0000) ==
33636                                                   0x80000) ||
33637                                                  ((instr & 0x3f0000) ==
33638                                                   0x100000) ||
33639                                                  ((instr & 0x3f0000) ==
33640                                                   0x200000)) {
33641                                                UnallocatedT32(instr);
33642                                                return;
33643                                              }
33644                                              DataType dt =
33645                                                  Dt_imm6_4_Decode((instr >>
33646                                                                    19) &
33647                                                                       0x7,
33648                                                                   (instr >>
33649                                                                    28) &
33650                                                                       0x1);
33651                                              if (dt.Is(
33652                                                      kDataTypeValueInvalid)) {
33653                                                UnallocatedT32(instr);
33654                                                return;
33655                                              }
33656                                              if (((instr >> 12) & 1) != 0) {
33657                                                UnallocatedT32(instr);
33658                                                return;
33659                                              }
33660                                              unsigned rd =
33661                                                  ExtractQRegister(instr,
33662                                                                   22,
33663                                                                   12);
33664                                              unsigned rm =
33665                                                  ExtractDRegister(instr, 5, 0);
33666                                              uint32_t imm6 =
33667                                                  (instr >> 16) & 0x3f;
33668                                              uint32_t imm =
33669                                                  imm6 - dt.GetSize();
33670                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33671                                              vshll(CurrentCond(),
33672                                                    dt,
33673                                                    QRegister(rd),
33674                                                    DRegister(rm),
33675                                                    imm);
33676                                              break;
33677                                            }
33678                                            case 0x00230000: {
33679                                              // 0xefa30a10
33680                                              if (((instr & 0x380000) == 0x0) ||
33681                                                  ((instr & 0x3f0000) ==
33682                                                   0x80000) ||
33683                                                  ((instr & 0x3f0000) ==
33684                                                   0x100000) ||
33685                                                  ((instr & 0x3f0000) ==
33686                                                   0x200000)) {
33687                                                UnallocatedT32(instr);
33688                                                return;
33689                                              }
33690                                              DataType dt =
33691                                                  Dt_imm6_4_Decode((instr >>
33692                                                                    19) &
33693                                                                       0x7,
33694                                                                   (instr >>
33695                                                                    28) &
33696                                                                       0x1);
33697                                              if (dt.Is(
33698                                                      kDataTypeValueInvalid)) {
33699                                                UnallocatedT32(instr);
33700                                                return;
33701                                              }
33702                                              if (((instr >> 12) & 1) != 0) {
33703                                                UnallocatedT32(instr);
33704                                                return;
33705                                              }
33706                                              unsigned rd =
33707                                                  ExtractQRegister(instr,
33708                                                                   22,
33709                                                                   12);
33710                                              unsigned rm =
33711                                                  ExtractDRegister(instr, 5, 0);
33712                                              uint32_t imm6 =
33713                                                  (instr >> 16) & 0x3f;
33714                                              uint32_t imm =
33715                                                  imm6 - dt.GetSize();
33716                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33717                                              vshll(CurrentCond(),
33718                                                    dt,
33719                                                    QRegister(rd),
33720                                                    DRegister(rm),
33721                                                    imm);
33722                                              break;
33723                                            }
33724                                            case 0x00240000: {
33725                                              // 0xefa40a10
33726                                              if (((instr & 0x380000) == 0x0) ||
33727                                                  ((instr & 0x3f0000) ==
33728                                                   0x80000) ||
33729                                                  ((instr & 0x3f0000) ==
33730                                                   0x100000) ||
33731                                                  ((instr & 0x3f0000) ==
33732                                                   0x200000)) {
33733                                                UnallocatedT32(instr);
33734                                                return;
33735                                              }
33736                                              DataType dt =
33737                                                  Dt_imm6_4_Decode((instr >>
33738                                                                    19) &
33739                                                                       0x7,
33740                                                                   (instr >>
33741                                                                    28) &
33742                                                                       0x1);
33743                                              if (dt.Is(
33744                                                      kDataTypeValueInvalid)) {
33745                                                UnallocatedT32(instr);
33746                                                return;
33747                                              }
33748                                              if (((instr >> 12) & 1) != 0) {
33749                                                UnallocatedT32(instr);
33750                                                return;
33751                                              }
33752                                              unsigned rd =
33753                                                  ExtractQRegister(instr,
33754                                                                   22,
33755                                                                   12);
33756                                              unsigned rm =
33757                                                  ExtractDRegister(instr, 5, 0);
33758                                              uint32_t imm6 =
33759                                                  (instr >> 16) & 0x3f;
33760                                              uint32_t imm =
33761                                                  imm6 - dt.GetSize();
33762                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33763                                              vshll(CurrentCond(),
33764                                                    dt,
33765                                                    QRegister(rd),
33766                                                    DRegister(rm),
33767                                                    imm);
33768                                              break;
33769                                            }
33770                                            case 0x00250000: {
33771                                              // 0xefa50a10
33772                                              if (((instr & 0x380000) == 0x0) ||
33773                                                  ((instr & 0x3f0000) ==
33774                                                   0x80000) ||
33775                                                  ((instr & 0x3f0000) ==
33776                                                   0x100000) ||
33777                                                  ((instr & 0x3f0000) ==
33778                                                   0x200000)) {
33779                                                UnallocatedT32(instr);
33780                                                return;
33781                                              }
33782                                              DataType dt =
33783                                                  Dt_imm6_4_Decode((instr >>
33784                                                                    19) &
33785                                                                       0x7,
33786                                                                   (instr >>
33787                                                                    28) &
33788                                                                       0x1);
33789                                              if (dt.Is(
33790                                                      kDataTypeValueInvalid)) {
33791                                                UnallocatedT32(instr);
33792                                                return;
33793                                              }
33794                                              if (((instr >> 12) & 1) != 0) {
33795                                                UnallocatedT32(instr);
33796                                                return;
33797                                              }
33798                                              unsigned rd =
33799                                                  ExtractQRegister(instr,
33800                                                                   22,
33801                                                                   12);
33802                                              unsigned rm =
33803                                                  ExtractDRegister(instr, 5, 0);
33804                                              uint32_t imm6 =
33805                                                  (instr >> 16) & 0x3f;
33806                                              uint32_t imm =
33807                                                  imm6 - dt.GetSize();
33808                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33809                                              vshll(CurrentCond(),
33810                                                    dt,
33811                                                    QRegister(rd),
33812                                                    DRegister(rm),
33813                                                    imm);
33814                                              break;
33815                                            }
33816                                            case 0x00260000: {
33817                                              // 0xefa60a10
33818                                              if (((instr & 0x380000) == 0x0) ||
33819                                                  ((instr & 0x3f0000) ==
33820                                                   0x80000) ||
33821                                                  ((instr & 0x3f0000) ==
33822                                                   0x100000) ||
33823                                                  ((instr & 0x3f0000) ==
33824                                                   0x200000)) {
33825                                                UnallocatedT32(instr);
33826                                                return;
33827                                              }
33828                                              DataType dt =
33829                                                  Dt_imm6_4_Decode((instr >>
33830                                                                    19) &
33831                                                                       0x7,
33832                                                                   (instr >>
33833                                                                    28) &
33834                                                                       0x1);
33835                                              if (dt.Is(
33836                                                      kDataTypeValueInvalid)) {
33837                                                UnallocatedT32(instr);
33838                                                return;
33839                                              }
33840                                              if (((instr >> 12) & 1) != 0) {
33841                                                UnallocatedT32(instr);
33842                                                return;
33843                                              }
33844                                              unsigned rd =
33845                                                  ExtractQRegister(instr,
33846                                                                   22,
33847                                                                   12);
33848                                              unsigned rm =
33849                                                  ExtractDRegister(instr, 5, 0);
33850                                              uint32_t imm6 =
33851                                                  (instr >> 16) & 0x3f;
33852                                              uint32_t imm =
33853                                                  imm6 - dt.GetSize();
33854                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33855                                              vshll(CurrentCond(),
33856                                                    dt,
33857                                                    QRegister(rd),
33858                                                    DRegister(rm),
33859                                                    imm);
33860                                              break;
33861                                            }
33862                                            case 0x00270000: {
33863                                              // 0xefa70a10
33864                                              if (((instr & 0x380000) == 0x0) ||
33865                                                  ((instr & 0x3f0000) ==
33866                                                   0x80000) ||
33867                                                  ((instr & 0x3f0000) ==
33868                                                   0x100000) ||
33869                                                  ((instr & 0x3f0000) ==
33870                                                   0x200000)) {
33871                                                UnallocatedT32(instr);
33872                                                return;
33873                                              }
33874                                              DataType dt =
33875                                                  Dt_imm6_4_Decode((instr >>
33876                                                                    19) &
33877                                                                       0x7,
33878                                                                   (instr >>
33879                                                                    28) &
33880                                                                       0x1);
33881                                              if (dt.Is(
33882                                                      kDataTypeValueInvalid)) {
33883                                                UnallocatedT32(instr);
33884                                                return;
33885                                              }
33886                                              if (((instr >> 12) & 1) != 0) {
33887                                                UnallocatedT32(instr);
33888                                                return;
33889                                              }
33890                                              unsigned rd =
33891                                                  ExtractQRegister(instr,
33892                                                                   22,
33893                                                                   12);
33894                                              unsigned rm =
33895                                                  ExtractDRegister(instr, 5, 0);
33896                                              uint32_t imm6 =
33897                                                  (instr >> 16) & 0x3f;
33898                                              uint32_t imm =
33899                                                  imm6 - dt.GetSize();
33900                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33901                                              vshll(CurrentCond(),
33902                                                    dt,
33903                                                    QRegister(rd),
33904                                                    DRegister(rm),
33905                                                    imm);
33906                                              break;
33907                                            }
33908                                            case 0x00280000: {
33909                                              // 0xefa80a10
33910                                              if (((instr & 0x380000) == 0x0) ||
33911                                                  ((instr & 0x3f0000) ==
33912                                                   0x80000) ||
33913                                                  ((instr & 0x3f0000) ==
33914                                                   0x100000) ||
33915                                                  ((instr & 0x3f0000) ==
33916                                                   0x200000)) {
33917                                                UnallocatedT32(instr);
33918                                                return;
33919                                              }
33920                                              DataType dt =
33921                                                  Dt_imm6_4_Decode((instr >>
33922                                                                    19) &
33923                                                                       0x7,
33924                                                                   (instr >>
33925                                                                    28) &
33926                                                                       0x1);
33927                                              if (dt.Is(
33928                                                      kDataTypeValueInvalid)) {
33929                                                UnallocatedT32(instr);
33930                                                return;
33931                                              }
33932                                              if (((instr >> 12) & 1) != 0) {
33933                                                UnallocatedT32(instr);
33934                                                return;
33935                                              }
33936                                              unsigned rd =
33937                                                  ExtractQRegister(instr,
33938                                                                   22,
33939                                                                   12);
33940                                              unsigned rm =
33941                                                  ExtractDRegister(instr, 5, 0);
33942                                              uint32_t imm6 =
33943                                                  (instr >> 16) & 0x3f;
33944                                              uint32_t imm =
33945                                                  imm6 - dt.GetSize();
33946                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33947                                              vshll(CurrentCond(),
33948                                                    dt,
33949                                                    QRegister(rd),
33950                                                    DRegister(rm),
33951                                                    imm);
33952                                              break;
33953                                            }
33954                                            case 0x00290000: {
33955                                              // 0xefa90a10
33956                                              if (((instr & 0x380000) == 0x0) ||
33957                                                  ((instr & 0x3f0000) ==
33958                                                   0x80000) ||
33959                                                  ((instr & 0x3f0000) ==
33960                                                   0x100000) ||
33961                                                  ((instr & 0x3f0000) ==
33962                                                   0x200000)) {
33963                                                UnallocatedT32(instr);
33964                                                return;
33965                                              }
33966                                              DataType dt =
33967                                                  Dt_imm6_4_Decode((instr >>
33968                                                                    19) &
33969                                                                       0x7,
33970                                                                   (instr >>
33971                                                                    28) &
33972                                                                       0x1);
33973                                              if (dt.Is(
33974                                                      kDataTypeValueInvalid)) {
33975                                                UnallocatedT32(instr);
33976                                                return;
33977                                              }
33978                                              if (((instr >> 12) & 1) != 0) {
33979                                                UnallocatedT32(instr);
33980                                                return;
33981                                              }
33982                                              unsigned rd =
33983                                                  ExtractQRegister(instr,
33984                                                                   22,
33985                                                                   12);
33986                                              unsigned rm =
33987                                                  ExtractDRegister(instr, 5, 0);
33988                                              uint32_t imm6 =
33989                                                  (instr >> 16) & 0x3f;
33990                                              uint32_t imm =
33991                                                  imm6 - dt.GetSize();
33992                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33993                                              vshll(CurrentCond(),
33994                                                    dt,
33995                                                    QRegister(rd),
33996                                                    DRegister(rm),
33997                                                    imm);
33998                                              break;
33999                                            }
34000                                            case 0x002a0000: {
34001                                              // 0xefaa0a10
34002                                              if (((instr & 0x380000) == 0x0) ||
34003                                                  ((instr & 0x3f0000) ==
34004                                                   0x80000) ||
34005                                                  ((instr & 0x3f0000) ==
34006                                                   0x100000) ||
34007                                                  ((instr & 0x3f0000) ==
34008                                                   0x200000)) {
34009                                                UnallocatedT32(instr);
34010                                                return;
34011                                              }
34012                                              DataType dt =
34013                                                  Dt_imm6_4_Decode((instr >>
34014                                                                    19) &
34015                                                                       0x7,
34016                                                                   (instr >>
34017                                                                    28) &
34018                                                                       0x1);
34019                                              if (dt.Is(
34020                                                      kDataTypeValueInvalid)) {
34021                                                UnallocatedT32(instr);
34022                                                return;
34023                                              }
34024                                              if (((instr >> 12) & 1) != 0) {
34025                                                UnallocatedT32(instr);
34026                                                return;
34027                                              }
34028                                              unsigned rd =
34029                                                  ExtractQRegister(instr,
34030                                                                   22,
34031                                                                   12);
34032                                              unsigned rm =
34033                                                  ExtractDRegister(instr, 5, 0);
34034                                              uint32_t imm6 =
34035                                                  (instr >> 16) & 0x3f;
34036                                              uint32_t imm =
34037                                                  imm6 - dt.GetSize();
34038                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34039                                              vshll(CurrentCond(),
34040                                                    dt,
34041                                                    QRegister(rd),
34042                                                    DRegister(rm),
34043                                                    imm);
34044                                              break;
34045                                            }
34046                                            case 0x002b0000: {
34047                                              // 0xefab0a10
34048                                              if (((instr & 0x380000) == 0x0) ||
34049                                                  ((instr & 0x3f0000) ==
34050                                                   0x80000) ||
34051                                                  ((instr & 0x3f0000) ==
34052                                                   0x100000) ||
34053                                                  ((instr & 0x3f0000) ==
34054                                                   0x200000)) {
34055                                                UnallocatedT32(instr);
34056                                                return;
34057                                              }
34058                                              DataType dt =
34059                                                  Dt_imm6_4_Decode((instr >>
34060                                                                    19) &
34061                                                                       0x7,
34062                                                                   (instr >>
34063                                                                    28) &
34064                                                                       0x1);
34065                                              if (dt.Is(
34066                                                      kDataTypeValueInvalid)) {
34067                                                UnallocatedT32(instr);
34068                                                return;
34069                                              }
34070                                              if (((instr >> 12) & 1) != 0) {
34071                                                UnallocatedT32(instr);
34072                                                return;
34073                                              }
34074                                              unsigned rd =
34075                                                  ExtractQRegister(instr,
34076                                                                   22,
34077                                                                   12);
34078                                              unsigned rm =
34079                                                  ExtractDRegister(instr, 5, 0);
34080                                              uint32_t imm6 =
34081                                                  (instr >> 16) & 0x3f;
34082                                              uint32_t imm =
34083                                                  imm6 - dt.GetSize();
34084                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34085                                              vshll(CurrentCond(),
34086                                                    dt,
34087                                                    QRegister(rd),
34088                                                    DRegister(rm),
34089                                                    imm);
34090                                              break;
34091                                            }
34092                                            case 0x002c0000: {
34093                                              // 0xefac0a10
34094                                              if (((instr & 0x380000) == 0x0) ||
34095                                                  ((instr & 0x3f0000) ==
34096                                                   0x80000) ||
34097                                                  ((instr & 0x3f0000) ==
34098                                                   0x100000) ||
34099                                                  ((instr & 0x3f0000) ==
34100                                                   0x200000)) {
34101                                                UnallocatedT32(instr);
34102                                                return;
34103                                              }
34104                                              DataType dt =
34105                                                  Dt_imm6_4_Decode((instr >>
34106                                                                    19) &
34107                                                                       0x7,
34108                                                                   (instr >>
34109                                                                    28) &
34110                                                                       0x1);
34111                                              if (dt.Is(
34112                                                      kDataTypeValueInvalid)) {
34113                                                UnallocatedT32(instr);
34114                                                return;
34115                                              }
34116                                              if (((instr >> 12) & 1) != 0) {
34117                                                UnallocatedT32(instr);
34118                                                return;
34119                                              }
34120                                              unsigned rd =
34121                                                  ExtractQRegister(instr,
34122                                                                   22,
34123                                                                   12);
34124                                              unsigned rm =
34125                                                  ExtractDRegister(instr, 5, 0);
34126                                              uint32_t imm6 =
34127                                                  (instr >> 16) & 0x3f;
34128                                              uint32_t imm =
34129                                                  imm6 - dt.GetSize();
34130                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34131                                              vshll(CurrentCond(),
34132                                                    dt,
34133                                                    QRegister(rd),
34134                                                    DRegister(rm),
34135                                                    imm);
34136                                              break;
34137                                            }
34138                                            case 0x002d0000: {
34139                                              // 0xefad0a10
34140                                              if (((instr & 0x380000) == 0x0) ||
34141                                                  ((instr & 0x3f0000) ==
34142                                                   0x80000) ||
34143                                                  ((instr & 0x3f0000) ==
34144                                                   0x100000) ||
34145                                                  ((instr & 0x3f0000) ==
34146                                                   0x200000)) {
34147                                                UnallocatedT32(instr);
34148                                                return;
34149                                              }
34150                                              DataType dt =
34151                                                  Dt_imm6_4_Decode((instr >>
34152                                                                    19) &
34153                                                                       0x7,
34154                                                                   (instr >>
34155                                                                    28) &
34156                                                                       0x1);
34157                                              if (dt.Is(
34158                                                      kDataTypeValueInvalid)) {
34159                                                UnallocatedT32(instr);
34160                                                return;
34161                                              }
34162                                              if (((instr >> 12) & 1) != 0) {
34163                                                UnallocatedT32(instr);
34164                                                return;
34165                                              }
34166                                              unsigned rd =
34167                                                  ExtractQRegister(instr,
34168                                                                   22,
34169                                                                   12);
34170                                              unsigned rm =
34171                                                  ExtractDRegister(instr, 5, 0);
34172                                              uint32_t imm6 =
34173                                                  (instr >> 16) & 0x3f;
34174                                              uint32_t imm =
34175                                                  imm6 - dt.GetSize();
34176                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34177                                              vshll(CurrentCond(),
34178                                                    dt,
34179                                                    QRegister(rd),
34180                                                    DRegister(rm),
34181                                                    imm);
34182                                              break;
34183                                            }
34184                                            case 0x002e0000: {
34185                                              // 0xefae0a10
34186                                              if (((instr & 0x380000) == 0x0) ||
34187                                                  ((instr & 0x3f0000) ==
34188                                                   0x80000) ||
34189                                                  ((instr & 0x3f0000) ==
34190                                                   0x100000) ||
34191                                                  ((instr & 0x3f0000) ==
34192                                                   0x200000)) {
34193                                                UnallocatedT32(instr);
34194                                                return;
34195                                              }
34196                                              DataType dt =
34197                                                  Dt_imm6_4_Decode((instr >>
34198                                                                    19) &
34199                                                                       0x7,
34200                                                                   (instr >>
34201                                                                    28) &
34202                                                                       0x1);
34203                                              if (dt.Is(
34204                                                      kDataTypeValueInvalid)) {
34205                                                UnallocatedT32(instr);
34206                                                return;
34207                                              }
34208                                              if (((instr >> 12) & 1) != 0) {
34209                                                UnallocatedT32(instr);
34210                                                return;
34211                                              }
34212                                              unsigned rd =
34213                                                  ExtractQRegister(instr,
34214                                                                   22,
34215                                                                   12);
34216                                              unsigned rm =
34217                                                  ExtractDRegister(instr, 5, 0);
34218                                              uint32_t imm6 =
34219                                                  (instr >> 16) & 0x3f;
34220                                              uint32_t imm =
34221                                                  imm6 - dt.GetSize();
34222                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34223                                              vshll(CurrentCond(),
34224                                                    dt,
34225                                                    QRegister(rd),
34226                                                    DRegister(rm),
34227                                                    imm);
34228                                              break;
34229                                            }
34230                                            case 0x002f0000: {
34231                                              // 0xefaf0a10
34232                                              if (((instr & 0x380000) == 0x0) ||
34233                                                  ((instr & 0x3f0000) ==
34234                                                   0x80000) ||
34235                                                  ((instr & 0x3f0000) ==
34236                                                   0x100000) ||
34237                                                  ((instr & 0x3f0000) ==
34238                                                   0x200000)) {
34239                                                UnallocatedT32(instr);
34240                                                return;
34241                                              }
34242                                              DataType dt =
34243                                                  Dt_imm6_4_Decode((instr >>
34244                                                                    19) &
34245                                                                       0x7,
34246                                                                   (instr >>
34247                                                                    28) &
34248                                                                       0x1);
34249                                              if (dt.Is(
34250                                                      kDataTypeValueInvalid)) {
34251                                                UnallocatedT32(instr);
34252                                                return;
34253                                              }
34254                                              if (((instr >> 12) & 1) != 0) {
34255                                                UnallocatedT32(instr);
34256                                                return;
34257                                              }
34258                                              unsigned rd =
34259                                                  ExtractQRegister(instr,
34260                                                                   22,
34261                                                                   12);
34262                                              unsigned rm =
34263                                                  ExtractDRegister(instr, 5, 0);
34264                                              uint32_t imm6 =
34265                                                  (instr >> 16) & 0x3f;
34266                                              uint32_t imm =
34267                                                  imm6 - dt.GetSize();
34268                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34269                                              vshll(CurrentCond(),
34270                                                    dt,
34271                                                    QRegister(rd),
34272                                                    DRegister(rm),
34273                                                    imm);
34274                                              break;
34275                                            }
34276                                            case 0x00300000: {
34277                                              // 0xefb00a10
34278                                              if (((instr & 0x380000) == 0x0) ||
34279                                                  ((instr & 0x3f0000) ==
34280                                                   0x80000) ||
34281                                                  ((instr & 0x3f0000) ==
34282                                                   0x100000) ||
34283                                                  ((instr & 0x3f0000) ==
34284                                                   0x200000)) {
34285                                                UnallocatedT32(instr);
34286                                                return;
34287                                              }
34288                                              DataType dt =
34289                                                  Dt_imm6_4_Decode((instr >>
34290                                                                    19) &
34291                                                                       0x7,
34292                                                                   (instr >>
34293                                                                    28) &
34294                                                                       0x1);
34295                                              if (dt.Is(
34296                                                      kDataTypeValueInvalid)) {
34297                                                UnallocatedT32(instr);
34298                                                return;
34299                                              }
34300                                              if (((instr >> 12) & 1) != 0) {
34301                                                UnallocatedT32(instr);
34302                                                return;
34303                                              }
34304                                              unsigned rd =
34305                                                  ExtractQRegister(instr,
34306                                                                   22,
34307                                                                   12);
34308                                              unsigned rm =
34309                                                  ExtractDRegister(instr, 5, 0);
34310                                              uint32_t imm6 =
34311                                                  (instr >> 16) & 0x3f;
34312                                              uint32_t imm =
34313                                                  imm6 - dt.GetSize();
34314                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34315                                              vshll(CurrentCond(),
34316                                                    dt,
34317                                                    QRegister(rd),
34318                                                    DRegister(rm),
34319                                                    imm);
34320                                              break;
34321                                            }
34322                                            case 0x00310000: {
34323                                              // 0xefb10a10
34324                                              if (((instr & 0x380000) == 0x0) ||
34325                                                  ((instr & 0x3f0000) ==
34326                                                   0x80000) ||
34327                                                  ((instr & 0x3f0000) ==
34328                                                   0x100000) ||
34329                                                  ((instr & 0x3f0000) ==
34330                                                   0x200000)) {
34331                                                UnallocatedT32(instr);
34332                                                return;
34333                                              }
34334                                              DataType dt =
34335                                                  Dt_imm6_4_Decode((instr >>
34336                                                                    19) &
34337                                                                       0x7,
34338                                                                   (instr >>
34339                                                                    28) &
34340                                                                       0x1);
34341                                              if (dt.Is(
34342                                                      kDataTypeValueInvalid)) {
34343                                                UnallocatedT32(instr);
34344                                                return;
34345                                              }
34346                                              if (((instr >> 12) & 1) != 0) {
34347                                                UnallocatedT32(instr);
34348                                                return;
34349                                              }
34350                                              unsigned rd =
34351                                                  ExtractQRegister(instr,
34352                                                                   22,
34353                                                                   12);
34354                                              unsigned rm =
34355                                                  ExtractDRegister(instr, 5, 0);
34356                                              uint32_t imm6 =
34357                                                  (instr >> 16) & 0x3f;
34358                                              uint32_t imm =
34359                                                  imm6 - dt.GetSize();
34360                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34361                                              vshll(CurrentCond(),
34362                                                    dt,
34363                                                    QRegister(rd),
34364                                                    DRegister(rm),
34365                                                    imm);
34366                                              break;
34367                                            }
34368                                            case 0x00320000: {
34369                                              // 0xefb20a10
34370                                              if (((instr & 0x380000) == 0x0) ||
34371                                                  ((instr & 0x3f0000) ==
34372                                                   0x80000) ||
34373                                                  ((instr & 0x3f0000) ==
34374                                                   0x100000) ||
34375                                                  ((instr & 0x3f0000) ==
34376                                                   0x200000)) {
34377                                                UnallocatedT32(instr);
34378                                                return;
34379                                              }
34380                                              DataType dt =
34381                                                  Dt_imm6_4_Decode((instr >>
34382                                                                    19) &
34383                                                                       0x7,
34384                                                                   (instr >>
34385                                                                    28) &
34386                                                                       0x1);
34387                                              if (dt.Is(
34388                                                      kDataTypeValueInvalid)) {
34389                                                UnallocatedT32(instr);
34390                                                return;
34391                                              }
34392                                              if (((instr >> 12) & 1) != 0) {
34393                                                UnallocatedT32(instr);
34394                                                return;
34395                                              }
34396                                              unsigned rd =
34397                                                  ExtractQRegister(instr,
34398                                                                   22,
34399                                                                   12);
34400                                              unsigned rm =
34401                                                  ExtractDRegister(instr, 5, 0);
34402                                              uint32_t imm6 =
34403                                                  (instr >> 16) & 0x3f;
34404                                              uint32_t imm =
34405                                                  imm6 - dt.GetSize();
34406                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34407                                              vshll(CurrentCond(),
34408                                                    dt,
34409                                                    QRegister(rd),
34410                                                    DRegister(rm),
34411                                                    imm);
34412                                              break;
34413                                            }
34414                                            case 0x00330000: {
34415                                              // 0xefb30a10
34416                                              if (((instr & 0x380000) == 0x0) ||
34417                                                  ((instr & 0x3f0000) ==
34418                                                   0x80000) ||
34419                                                  ((instr & 0x3f0000) ==
34420                                                   0x100000) ||
34421                                                  ((instr & 0x3f0000) ==
34422                                                   0x200000)) {
34423                                                UnallocatedT32(instr);
34424                                                return;
34425                                              }
34426                                              DataType dt =
34427                                                  Dt_imm6_4_Decode((instr >>
34428                                                                    19) &
34429                                                                       0x7,
34430                                                                   (instr >>
34431                                                                    28) &
34432                                                                       0x1);
34433                                              if (dt.Is(
34434                                                      kDataTypeValueInvalid)) {
34435                                                UnallocatedT32(instr);
34436                                                return;
34437                                              }
34438                                              if (((instr >> 12) & 1) != 0) {
34439                                                UnallocatedT32(instr);
34440                                                return;
34441                                              }
34442                                              unsigned rd =
34443                                                  ExtractQRegister(instr,
34444                                                                   22,
34445                                                                   12);
34446                                              unsigned rm =
34447                                                  ExtractDRegister(instr, 5, 0);
34448                                              uint32_t imm6 =
34449                                                  (instr >> 16) & 0x3f;
34450                                              uint32_t imm =
34451                                                  imm6 - dt.GetSize();
34452                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34453                                              vshll(CurrentCond(),
34454                                                    dt,
34455                                                    QRegister(rd),
34456                                                    DRegister(rm),
34457                                                    imm);
34458                                              break;
34459                                            }
34460                                            case 0x00340000: {
34461                                              // 0xefb40a10
34462                                              if (((instr & 0x380000) == 0x0) ||
34463                                                  ((instr & 0x3f0000) ==
34464                                                   0x80000) ||
34465                                                  ((instr & 0x3f0000) ==
34466                                                   0x100000) ||
34467                                                  ((instr & 0x3f0000) ==
34468                                                   0x200000)) {
34469                                                UnallocatedT32(instr);
34470                                                return;
34471                                              }
34472                                              DataType dt =
34473                                                  Dt_imm6_4_Decode((instr >>
34474                                                                    19) &
34475                                                                       0x7,
34476                                                                   (instr >>
34477                                                                    28) &
34478                                                                       0x1);
34479                                              if (dt.Is(
34480                                                      kDataTypeValueInvalid)) {
34481                                                UnallocatedT32(instr);
34482                                                return;
34483                                              }
34484                                              if (((instr >> 12) & 1) != 0) {
34485                                                UnallocatedT32(instr);
34486                                                return;
34487                                              }
34488                                              unsigned rd =
34489                                                  ExtractQRegister(instr,
34490                                                                   22,
34491                                                                   12);
34492                                              unsigned rm =
34493                                                  ExtractDRegister(instr, 5, 0);
34494                                              uint32_t imm6 =
34495                                                  (instr >> 16) & 0x3f;
34496                                              uint32_t imm =
34497                                                  imm6 - dt.GetSize();
34498                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34499                                              vshll(CurrentCond(),
34500                                                    dt,
34501                                                    QRegister(rd),
34502                                                    DRegister(rm),
34503                                                    imm);
34504                                              break;
34505                                            }
34506                                            case 0x00350000: {
34507                                              // 0xefb50a10
34508                                              if (((instr & 0x380000) == 0x0) ||
34509                                                  ((instr & 0x3f0000) ==
34510                                                   0x80000) ||
34511                                                  ((instr & 0x3f0000) ==
34512                                                   0x100000) ||
34513                                                  ((instr & 0x3f0000) ==
34514                                                   0x200000)) {
34515                                                UnallocatedT32(instr);
34516                                                return;
34517                                              }
34518                                              DataType dt =
34519                                                  Dt_imm6_4_Decode((instr >>
34520                                                                    19) &
34521                                                                       0x7,
34522                                                                   (instr >>
34523                                                                    28) &
34524                                                                       0x1);
34525                                              if (dt.Is(
34526                                                      kDataTypeValueInvalid)) {
34527                                                UnallocatedT32(instr);
34528                                                return;
34529                                              }
34530                                              if (((instr >> 12) & 1) != 0) {
34531                                                UnallocatedT32(instr);
34532                                                return;
34533                                              }
34534                                              unsigned rd =
34535                                                  ExtractQRegister(instr,
34536                                                                   22,
34537                                                                   12);
34538                                              unsigned rm =
34539                                                  ExtractDRegister(instr, 5, 0);
34540                                              uint32_t imm6 =
34541                                                  (instr >> 16) & 0x3f;
34542                                              uint32_t imm =
34543                                                  imm6 - dt.GetSize();
34544                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34545                                              vshll(CurrentCond(),
34546                                                    dt,
34547                                                    QRegister(rd),
34548                                                    DRegister(rm),
34549                                                    imm);
34550                                              break;
34551                                            }
34552                                            case 0x00360000: {
34553                                              // 0xefb60a10
34554                                              if (((instr & 0x380000) == 0x0) ||
34555                                                  ((instr & 0x3f0000) ==
34556                                                   0x80000) ||
34557                                                  ((instr & 0x3f0000) ==
34558                                                   0x100000) ||
34559                                                  ((instr & 0x3f0000) ==
34560                                                   0x200000)) {
34561                                                UnallocatedT32(instr);
34562                                                return;
34563                                              }
34564                                              DataType dt =
34565                                                  Dt_imm6_4_Decode((instr >>
34566                                                                    19) &
34567                                                                       0x7,
34568                                                                   (instr >>
34569                                                                    28) &
34570                                                                       0x1);
34571                                              if (dt.Is(
34572                                                      kDataTypeValueInvalid)) {
34573                                                UnallocatedT32(instr);
34574                                                return;
34575                                              }
34576                                              if (((instr >> 12) & 1) != 0) {
34577                                                UnallocatedT32(instr);
34578                                                return;
34579                                              }
34580                                              unsigned rd =
34581                                                  ExtractQRegister(instr,
34582                                                                   22,
34583                                                                   12);
34584                                              unsigned rm =
34585                                                  ExtractDRegister(instr, 5, 0);
34586                                              uint32_t imm6 =
34587                                                  (instr >> 16) & 0x3f;
34588                                              uint32_t imm =
34589                                                  imm6 - dt.GetSize();
34590                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34591                                              vshll(CurrentCond(),
34592                                                    dt,
34593                                                    QRegister(rd),
34594                                                    DRegister(rm),
34595                                                    imm);
34596                                              break;
34597                                            }
34598                                            case 0x00370000: {
34599                                              // 0xefb70a10
34600                                              if (((instr & 0x380000) == 0x0) ||
34601                                                  ((instr & 0x3f0000) ==
34602                                                   0x80000) ||
34603                                                  ((instr & 0x3f0000) ==
34604                                                   0x100000) ||
34605                                                  ((instr & 0x3f0000) ==
34606                                                   0x200000)) {
34607                                                UnallocatedT32(instr);
34608                                                return;
34609                                              }
34610                                              DataType dt =
34611                                                  Dt_imm6_4_Decode((instr >>
34612                                                                    19) &
34613                                                                       0x7,
34614                                                                   (instr >>
34615                                                                    28) &
34616                                                                       0x1);
34617                                              if (dt.Is(
34618                                                      kDataTypeValueInvalid)) {
34619                                                UnallocatedT32(instr);
34620                                                return;
34621                                              }
34622                                              if (((instr >> 12) & 1) != 0) {
34623                                                UnallocatedT32(instr);
34624                                                return;
34625                                              }
34626                                              unsigned rd =
34627                                                  ExtractQRegister(instr,
34628                                                                   22,
34629                                                                   12);
34630                                              unsigned rm =
34631                                                  ExtractDRegister(instr, 5, 0);
34632                                              uint32_t imm6 =
34633                                                  (instr >> 16) & 0x3f;
34634                                              uint32_t imm =
34635                                                  imm6 - dt.GetSize();
34636                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34637                                              vshll(CurrentCond(),
34638                                                    dt,
34639                                                    QRegister(rd),
34640                                                    DRegister(rm),
34641                                                    imm);
34642                                              break;
34643                                            }
34644                                            case 0x00380000: {
34645                                              // 0xefb80a10
34646                                              if (((instr & 0x380000) == 0x0) ||
34647                                                  ((instr & 0x3f0000) ==
34648                                                   0x80000) ||
34649                                                  ((instr & 0x3f0000) ==
34650                                                   0x100000) ||
34651                                                  ((instr & 0x3f0000) ==
34652                                                   0x200000)) {
34653                                                UnallocatedT32(instr);
34654                                                return;
34655                                              }
34656                                              DataType dt =
34657                                                  Dt_imm6_4_Decode((instr >>
34658                                                                    19) &
34659                                                                       0x7,
34660                                                                   (instr >>
34661                                                                    28) &
34662                                                                       0x1);
34663                                              if (dt.Is(
34664                                                      kDataTypeValueInvalid)) {
34665                                                UnallocatedT32(instr);
34666                                                return;
34667                                              }
34668                                              if (((instr >> 12) & 1) != 0) {
34669                                                UnallocatedT32(instr);
34670                                                return;
34671                                              }
34672                                              unsigned rd =
34673                                                  ExtractQRegister(instr,
34674                                                                   22,
34675                                                                   12);
34676                                              unsigned rm =
34677                                                  ExtractDRegister(instr, 5, 0);
34678                                              uint32_t imm6 =
34679                                                  (instr >> 16) & 0x3f;
34680                                              uint32_t imm =
34681                                                  imm6 - dt.GetSize();
34682                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34683                                              vshll(CurrentCond(),
34684                                                    dt,
34685                                                    QRegister(rd),
34686                                                    DRegister(rm),
34687                                                    imm);
34688                                              break;
34689                                            }
34690                                            case 0x00390000: {
34691                                              // 0xefb90a10
34692                                              if (((instr & 0x380000) == 0x0) ||
34693                                                  ((instr & 0x3f0000) ==
34694                                                   0x80000) ||
34695                                                  ((instr & 0x3f0000) ==
34696                                                   0x100000) ||
34697                                                  ((instr & 0x3f0000) ==
34698                                                   0x200000)) {
34699                                                UnallocatedT32(instr);
34700                                                return;
34701                                              }
34702                                              DataType dt =
34703                                                  Dt_imm6_4_Decode((instr >>
34704                                                                    19) &
34705                                                                       0x7,
34706                                                                   (instr >>
34707                                                                    28) &
34708                                                                       0x1);
34709                                              if (dt.Is(
34710                                                      kDataTypeValueInvalid)) {
34711                                                UnallocatedT32(instr);
34712                                                return;
34713                                              }
34714                                              if (((instr >> 12) & 1) != 0) {
34715                                                UnallocatedT32(instr);
34716                                                return;
34717                                              }
34718                                              unsigned rd =
34719                                                  ExtractQRegister(instr,
34720                                                                   22,
34721                                                                   12);
34722                                              unsigned rm =
34723                                                  ExtractDRegister(instr, 5, 0);
34724                                              uint32_t imm6 =
34725                                                  (instr >> 16) & 0x3f;
34726                                              uint32_t imm =
34727                                                  imm6 - dt.GetSize();
34728                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34729                                              vshll(CurrentCond(),
34730                                                    dt,
34731                                                    QRegister(rd),
34732                                                    DRegister(rm),
34733                                                    imm);
34734                                              break;
34735                                            }
34736                                            case 0x003a0000: {
34737                                              // 0xefba0a10
34738                                              if (((instr & 0x380000) == 0x0) ||
34739                                                  ((instr & 0x3f0000) ==
34740                                                   0x80000) ||
34741                                                  ((instr & 0x3f0000) ==
34742                                                   0x100000) ||
34743                                                  ((instr & 0x3f0000) ==
34744                                                   0x200000)) {
34745                                                UnallocatedT32(instr);
34746                                                return;
34747                                              }
34748                                              DataType dt =
34749                                                  Dt_imm6_4_Decode((instr >>
34750                                                                    19) &
34751                                                                       0x7,
34752                                                                   (instr >>
34753                                                                    28) &
34754                                                                       0x1);
34755                                              if (dt.Is(
34756                                                      kDataTypeValueInvalid)) {
34757                                                UnallocatedT32(instr);
34758                                                return;
34759                                              }
34760                                              if (((instr >> 12) & 1) != 0) {
34761                                                UnallocatedT32(instr);
34762                                                return;
34763                                              }
34764                                              unsigned rd =
34765                                                  ExtractQRegister(instr,
34766                                                                   22,
34767                                                                   12);
34768                                              unsigned rm =
34769                                                  ExtractDRegister(instr, 5, 0);
34770                                              uint32_t imm6 =
34771                                                  (instr >> 16) & 0x3f;
34772                                              uint32_t imm =
34773                                                  imm6 - dt.GetSize();
34774                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34775                                              vshll(CurrentCond(),
34776                                                    dt,
34777                                                    QRegister(rd),
34778                                                    DRegister(rm),
34779                                                    imm);
34780                                              break;
34781                                            }
34782                                            case 0x003b0000: {
34783                                              // 0xefbb0a10
34784                                              if (((instr & 0x380000) == 0x0) ||
34785                                                  ((instr & 0x3f0000) ==
34786                                                   0x80000) ||
34787                                                  ((instr & 0x3f0000) ==
34788                                                   0x100000) ||
34789                                                  ((instr & 0x3f0000) ==
34790                                                   0x200000)) {
34791                                                UnallocatedT32(instr);
34792                                                return;
34793                                              }
34794                                              DataType dt =
34795                                                  Dt_imm6_4_Decode((instr >>
34796                                                                    19) &
34797                                                                       0x7,
34798                                                                   (instr >>
34799                                                                    28) &
34800                                                                       0x1);
34801                                              if (dt.Is(
34802                                                      kDataTypeValueInvalid)) {
34803                                                UnallocatedT32(instr);
34804                                                return;
34805                                              }
34806                                              if (((instr >> 12) & 1) != 0) {
34807                                                UnallocatedT32(instr);
34808                                                return;
34809                                              }
34810                                              unsigned rd =
34811                                                  ExtractQRegister(instr,
34812                                                                   22,
34813                                                                   12);
34814                                              unsigned rm =
34815                                                  ExtractDRegister(instr, 5, 0);
34816                                              uint32_t imm6 =
34817                                                  (instr >> 16) & 0x3f;
34818                                              uint32_t imm =
34819                                                  imm6 - dt.GetSize();
34820                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34821                                              vshll(CurrentCond(),
34822                                                    dt,
34823                                                    QRegister(rd),
34824                                                    DRegister(rm),
34825                                                    imm);
34826                                              break;
34827                                            }
34828                                            case 0x003c0000: {
34829                                              // 0xefbc0a10
34830                                              if (((instr & 0x380000) == 0x0) ||
34831                                                  ((instr & 0x3f0000) ==
34832                                                   0x80000) ||
34833                                                  ((instr & 0x3f0000) ==
34834                                                   0x100000) ||
34835                                                  ((instr & 0x3f0000) ==
34836                                                   0x200000)) {
34837                                                UnallocatedT32(instr);
34838                                                return;
34839                                              }
34840                                              DataType dt =
34841                                                  Dt_imm6_4_Decode((instr >>
34842                                                                    19) &
34843                                                                       0x7,
34844                                                                   (instr >>
34845                                                                    28) &
34846                                                                       0x1);
34847                                              if (dt.Is(
34848                                                      kDataTypeValueInvalid)) {
34849                                                UnallocatedT32(instr);
34850                                                return;
34851                                              }
34852                                              if (((instr >> 12) & 1) != 0) {
34853                                                UnallocatedT32(instr);
34854                                                return;
34855                                              }
34856                                              unsigned rd =
34857                                                  ExtractQRegister(instr,
34858                                                                   22,
34859                                                                   12);
34860                                              unsigned rm =
34861                                                  ExtractDRegister(instr, 5, 0);
34862                                              uint32_t imm6 =
34863                                                  (instr >> 16) & 0x3f;
34864                                              uint32_t imm =
34865                                                  imm6 - dt.GetSize();
34866                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34867                                              vshll(CurrentCond(),
34868                                                    dt,
34869                                                    QRegister(rd),
34870                                                    DRegister(rm),
34871                                                    imm);
34872                                              break;
34873                                            }
34874                                            case 0x003d0000: {
34875                                              // 0xefbd0a10
34876                                              if (((instr & 0x380000) == 0x0) ||
34877                                                  ((instr & 0x3f0000) ==
34878                                                   0x80000) ||
34879                                                  ((instr & 0x3f0000) ==
34880                                                   0x100000) ||
34881                                                  ((instr & 0x3f0000) ==
34882                                                   0x200000)) {
34883                                                UnallocatedT32(instr);
34884                                                return;
34885                                              }
34886                                              DataType dt =
34887                                                  Dt_imm6_4_Decode((instr >>
34888                                                                    19) &
34889                                                                       0x7,
34890                                                                   (instr >>
34891                                                                    28) &
34892                                                                       0x1);
34893                                              if (dt.Is(
34894                                                      kDataTypeValueInvalid)) {
34895                                                UnallocatedT32(instr);
34896                                                return;
34897                                              }
34898                                              if (((instr >> 12) & 1) != 0) {
34899                                                UnallocatedT32(instr);
34900                                                return;
34901                                              }
34902                                              unsigned rd =
34903                                                  ExtractQRegister(instr,
34904                                                                   22,
34905                                                                   12);
34906                                              unsigned rm =
34907                                                  ExtractDRegister(instr, 5, 0);
34908                                              uint32_t imm6 =
34909                                                  (instr >> 16) & 0x3f;
34910                                              uint32_t imm =
34911                                                  imm6 - dt.GetSize();
34912                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34913                                              vshll(CurrentCond(),
34914                                                    dt,
34915                                                    QRegister(rd),
34916                                                    DRegister(rm),
34917                                                    imm);
34918                                              break;
34919                                            }
34920                                            case 0x003e0000: {
34921                                              // 0xefbe0a10
34922                                              if (((instr & 0x380000) == 0x0) ||
34923                                                  ((instr & 0x3f0000) ==
34924                                                   0x80000) ||
34925                                                  ((instr & 0x3f0000) ==
34926                                                   0x100000) ||
34927                                                  ((instr & 0x3f0000) ==
34928                                                   0x200000)) {
34929                                                UnallocatedT32(instr);
34930                                                return;
34931                                              }
34932                                              DataType dt =
34933                                                  Dt_imm6_4_Decode((instr >>
34934                                                                    19) &
34935                                                                       0x7,
34936                                                                   (instr >>
34937                                                                    28) &
34938                                                                       0x1);
34939                                              if (dt.Is(
34940                                                      kDataTypeValueInvalid)) {
34941                                                UnallocatedT32(instr);
34942                                                return;
34943                                              }
34944                                              if (((instr >> 12) & 1) != 0) {
34945                                                UnallocatedT32(instr);
34946                                                return;
34947                                              }
34948                                              unsigned rd =
34949                                                  ExtractQRegister(instr,
34950                                                                   22,
34951                                                                   12);
34952                                              unsigned rm =
34953                                                  ExtractDRegister(instr, 5, 0);
34954                                              uint32_t imm6 =
34955                                                  (instr >> 16) & 0x3f;
34956                                              uint32_t imm =
34957                                                  imm6 - dt.GetSize();
34958                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34959                                              vshll(CurrentCond(),
34960                                                    dt,
34961                                                    QRegister(rd),
34962                                                    DRegister(rm),
34963                                                    imm);
34964                                              break;
34965                                            }
34966                                            case 0x003f0000: {
34967                                              // 0xefbf0a10
34968                                              if (((instr & 0x380000) == 0x0) ||
34969                                                  ((instr & 0x3f0000) ==
34970                                                   0x80000) ||
34971                                                  ((instr & 0x3f0000) ==
34972                                                   0x100000) ||
34973                                                  ((instr & 0x3f0000) ==
34974                                                   0x200000)) {
34975                                                UnallocatedT32(instr);
34976                                                return;
34977                                              }
34978                                              DataType dt =
34979                                                  Dt_imm6_4_Decode((instr >>
34980                                                                    19) &
34981                                                                       0x7,
34982                                                                   (instr >>
34983                                                                    28) &
34984                                                                       0x1);
34985                                              if (dt.Is(
34986                                                      kDataTypeValueInvalid)) {
34987                                                UnallocatedT32(instr);
34988                                                return;
34989                                              }
34990                                              if (((instr >> 12) & 1) != 0) {
34991                                                UnallocatedT32(instr);
34992                                                return;
34993                                              }
34994                                              unsigned rd =
34995                                                  ExtractQRegister(instr,
34996                                                                   22,
34997                                                                   12);
34998                                              unsigned rm =
34999                                                  ExtractDRegister(instr, 5, 0);
35000                                              uint32_t imm6 =
35001                                                  (instr >> 16) & 0x3f;
35002                                              uint32_t imm =
35003                                                  imm6 - dt.GetSize();
35004                                              // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35005                                              vshll(CurrentCond(),
35006                                                    dt,
35007                                                    QRegister(rd),
35008                                                    DRegister(rm),
35009                                                    imm);
35010                                              break;
35011                                            }
35012                                            default:
35013                                              UnallocatedT32(instr);
35014                                              break;
35015                                          }
35016                                          break;
35017                                        }
35018                                        default: {
35019                                          if (((instr & 0x380000) == 0x0) ||
35020                                              ((instr & 0x3f0000) == 0x80000) ||
35021                                              ((instr & 0x3f0000) ==
35022                                               0x100000) ||
35023                                              ((instr & 0x3f0000) ==
35024                                               0x200000)) {
35025                                            UnallocatedT32(instr);
35026                                            return;
35027                                          }
35028                                          DataType dt =
35029                                              Dt_imm6_4_Decode((instr >> 19) &
35030                                                                   0x7,
35031                                                               (instr >> 28) &
35032                                                                   0x1);
35033                                          if (dt.Is(kDataTypeValueInvalid)) {
35034                                            UnallocatedT32(instr);
35035                                            return;
35036                                          }
35037                                          if (((instr >> 12) & 1) != 0) {
35038                                            UnallocatedT32(instr);
35039                                            return;
35040                                          }
35041                                          unsigned rd =
35042                                              ExtractQRegister(instr, 22, 12);
35043                                          unsigned rm =
35044                                              ExtractDRegister(instr, 5, 0);
35045                                          uint32_t imm6 = (instr >> 16) & 0x3f;
35046                                          uint32_t imm = imm6 - dt.GetSize();
35047                                          // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35048                                          vshll(CurrentCond(),
35049                                                dt,
35050                                                QRegister(rd),
35051                                                DRegister(rm),
35052                                                imm);
35053                                          break;
35054                                        }
35055                                      }
35056                                      break;
35057                                    }
35058                                    default:
35059                                      UnallocatedT32(instr);
35060                                      break;
35061                                  }
35062                                  break;
35063                                }
35064                              }
35065                              break;
35066                            }
35067                            default:
35068                              UnallocatedT32(instr);
35069                              break;
35070                          }
35071                          break;
35072                        }
35073                        case 0x00000c00: {
35074                          // 0xef800c10
35075                          switch (instr & 0x00000080) {
35076                            case 0x00000000: {
35077                              // 0xef800c10
35078                              switch (instr & 0x00200000) {
35079                                case 0x00000000: {
35080                                  // 0xef800c10
35081                                  switch (instr & 0x00180000) {
35082                                    case 0x00000000: {
35083                                      // 0xef800c10
35084                                      switch (instr & 0x00000300) {
35085                                        case 0x00000200: {
35086                                          // 0xef800e10
35087                                          if (((instr & 0x920) == 0x100) ||
35088                                              ((instr & 0x520) == 0x100) ||
35089                                              ((instr & 0x820) == 0x20) ||
35090                                              ((instr & 0x420) == 0x20) ||
35091                                              ((instr & 0x220) == 0x20) ||
35092                                              ((instr & 0x120) == 0x120)) {
35093                                            UnallocatedT32(instr);
35094                                            return;
35095                                          }
35096                                          unsigned cmode =
35097                                              ((instr >> 8) & 0xf) |
35098                                              ((instr >> 1) & 0x10);
35099                                          DataType dt =
35100                                              ImmediateVmov::DecodeDt(cmode);
35101                                          if (dt.Is(kDataTypeValueInvalid)) {
35102                                            UnallocatedT32(instr);
35103                                            return;
35104                                          }
35105                                          unsigned rd =
35106                                              ExtractDRegister(instr, 22, 12);
35107                                          DOperand imm =
35108                                              ImmediateVmov::DecodeImmediate(
35109                                                  cmode,
35110                                                  (instr & 0xf) |
35111                                                      ((instr >> 12) & 0x70) |
35112                                                      ((instr >> 21) & 0x80));
35113                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35114                                          vmov(CurrentCond(),
35115                                               dt,
35116                                               DRegister(rd),
35117                                               imm);
35118                                          break;
35119                                        }
35120                                        case 0x00000300: {
35121                                          // 0xef800f10
35122                                          if (((instr & 0x920) == 0x100) ||
35123                                              ((instr & 0x520) == 0x100) ||
35124                                              ((instr & 0x820) == 0x20) ||
35125                                              ((instr & 0x420) == 0x20) ||
35126                                              ((instr & 0x220) == 0x20) ||
35127                                              ((instr & 0x120) == 0x120)) {
35128                                            UnallocatedT32(instr);
35129                                            return;
35130                                          }
35131                                          unsigned cmode =
35132                                              ((instr >> 8) & 0xf) |
35133                                              ((instr >> 1) & 0x10);
35134                                          DataType dt =
35135                                              ImmediateVmov::DecodeDt(cmode);
35136                                          if (dt.Is(kDataTypeValueInvalid)) {
35137                                            UnallocatedT32(instr);
35138                                            return;
35139                                          }
35140                                          unsigned rd =
35141                                              ExtractDRegister(instr, 22, 12);
35142                                          DOperand imm =
35143                                              ImmediateVmov::DecodeImmediate(
35144                                                  cmode,
35145                                                  (instr & 0xf) |
35146                                                      ((instr >> 12) & 0x70) |
35147                                                      ((instr >> 21) & 0x80));
35148                                          // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35149                                          vmov(CurrentCond(),
35150                                               dt,
35151                                               DRegister(rd),
35152                                               imm);
35153                                          break;
35154                                        }
35155                                        default: {
35156                                          switch (instr & 0x00000020) {
35157                                            case 0x00000020: {
35158                                              // 0xef800c30
35159                                              switch (instr & 0x00000f20) {
35160                                                case 0x00000000: {
35161                                                  // 0xef800c10
35162                                                  if (((instr & 0x920) ==
35163                                                       0x100) ||
35164                                                      ((instr & 0x520) ==
35165                                                       0x100) ||
35166                                                      ((instr & 0x820) ==
35167                                                       0x20) ||
35168                                                      ((instr & 0x420) ==
35169                                                       0x20) ||
35170                                                      ((instr & 0x220) ==
35171                                                       0x20) ||
35172                                                      ((instr & 0x120) ==
35173                                                       0x120)) {
35174                                                    UnallocatedT32(instr);
35175                                                    return;
35176                                                  }
35177                                                  unsigned cmode =
35178                                                      ((instr >> 8) & 0xf) |
35179                                                      ((instr >> 1) & 0x10);
35180                                                  DataType dt =
35181                                                      ImmediateVmov::DecodeDt(
35182                                                          cmode);
35183                                                  if (dt.Is(
35184                                                          kDataTypeValueInvalid)) {
35185                                                    UnallocatedT32(instr);
35186                                                    return;
35187                                                  }
35188                                                  unsigned rd =
35189                                                      ExtractDRegister(instr,
35190                                                                       22,
35191                                                                       12);
35192                                                  DOperand imm = ImmediateVmov::
35193                                                      DecodeImmediate(
35194                                                          cmode,
35195                                                          (instr & 0xf) |
35196                                                              ((instr >> 12) &
35197                                                               0x70) |
35198                                                              ((instr >> 21) &
35199                                                               0x80));
35200                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35201                                                  vmov(CurrentCond(),
35202                                                       dt,
35203                                                       DRegister(rd),
35204                                                       imm);
35205                                                  break;
35206                                                }
35207                                                case 0x00000020: {
35208                                                  // 0xef800c30
35209                                                  if (((instr & 0xd00) ==
35210                                                       0x100) ||
35211                                                      ((instr & 0xd00) ==
35212                                                       0x500) ||
35213                                                      ((instr & 0xd00) ==
35214                                                       0x900) ||
35215                                                      ((instr & 0xe00) ==
35216                                                       0xe00)) {
35217                                                    UnallocatedT32(instr);
35218                                                    return;
35219                                                  }
35220                                                  unsigned cmode =
35221                                                      (instr >> 8) & 0xf;
35222                                                  DataType dt =
35223                                                      ImmediateVmvn::DecodeDt(
35224                                                          cmode);
35225                                                  if (dt.Is(
35226                                                          kDataTypeValueInvalid)) {
35227                                                    UnallocatedT32(instr);
35228                                                    return;
35229                                                  }
35230                                                  unsigned rd =
35231                                                      ExtractDRegister(instr,
35232                                                                       22,
35233                                                                       12);
35234                                                  DOperand imm = ImmediateVmvn::
35235                                                      DecodeImmediate(
35236                                                          cmode,
35237                                                          (instr & 0xf) |
35238                                                              ((instr >> 12) &
35239                                                               0x70) |
35240                                                              ((instr >> 21) &
35241                                                               0x80));
35242                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35243                                                  vmvn(CurrentCond(),
35244                                                       dt,
35245                                                       DRegister(rd),
35246                                                       imm);
35247                                                  break;
35248                                                }
35249                                                case 0x00000200: {
35250                                                  // 0xef800e10
35251                                                  if (((instr & 0x920) ==
35252                                                       0x100) ||
35253                                                      ((instr & 0x520) ==
35254                                                       0x100) ||
35255                                                      ((instr & 0x820) ==
35256                                                       0x20) ||
35257                                                      ((instr & 0x420) ==
35258                                                       0x20) ||
35259                                                      ((instr & 0x220) ==
35260                                                       0x20) ||
35261                                                      ((instr & 0x120) ==
35262                                                       0x120)) {
35263                                                    UnallocatedT32(instr);
35264                                                    return;
35265                                                  }
35266                                                  unsigned cmode =
35267                                                      ((instr >> 8) & 0xf) |
35268                                                      ((instr >> 1) & 0x10);
35269                                                  DataType dt =
35270                                                      ImmediateVmov::DecodeDt(
35271                                                          cmode);
35272                                                  if (dt.Is(
35273                                                          kDataTypeValueInvalid)) {
35274                                                    UnallocatedT32(instr);
35275                                                    return;
35276                                                  }
35277                                                  unsigned rd =
35278                                                      ExtractDRegister(instr,
35279                                                                       22,
35280                                                                       12);
35281                                                  DOperand imm = ImmediateVmov::
35282                                                      DecodeImmediate(
35283                                                          cmode,
35284                                                          (instr & 0xf) |
35285                                                              ((instr >> 12) &
35286                                                               0x70) |
35287                                                              ((instr >> 21) &
35288                                                               0x80));
35289                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35290                                                  vmov(CurrentCond(),
35291                                                       dt,
35292                                                       DRegister(rd),
35293                                                       imm);
35294                                                  break;
35295                                                }
35296                                                case 0x00000220: {
35297                                                  // 0xef800e30
35298                                                  if (((instr & 0xd00) ==
35299                                                       0x100) ||
35300                                                      ((instr & 0xd00) ==
35301                                                       0x500) ||
35302                                                      ((instr & 0xd00) ==
35303                                                       0x900) ||
35304                                                      ((instr & 0xe00) ==
35305                                                       0xe00)) {
35306                                                    UnallocatedT32(instr);
35307                                                    return;
35308                                                  }
35309                                                  unsigned cmode =
35310                                                      (instr >> 8) & 0xf;
35311                                                  DataType dt =
35312                                                      ImmediateVmvn::DecodeDt(
35313                                                          cmode);
35314                                                  if (dt.Is(
35315                                                          kDataTypeValueInvalid)) {
35316                                                    UnallocatedT32(instr);
35317                                                    return;
35318                                                  }
35319                                                  unsigned rd =
35320                                                      ExtractDRegister(instr,
35321                                                                       22,
35322                                                                       12);
35323                                                  DOperand imm = ImmediateVmvn::
35324                                                      DecodeImmediate(
35325                                                          cmode,
35326                                                          (instr & 0xf) |
35327                                                              ((instr >> 12) &
35328                                                               0x70) |
35329                                                              ((instr >> 21) &
35330                                                               0x80));
35331                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35332                                                  vmvn(CurrentCond(),
35333                                                       dt,
35334                                                       DRegister(rd),
35335                                                       imm);
35336                                                  break;
35337                                                }
35338                                                case 0x00000400: {
35339                                                  // 0xef800c10
35340                                                  if (((instr & 0x920) ==
35341                                                       0x100) ||
35342                                                      ((instr & 0x520) ==
35343                                                       0x100) ||
35344                                                      ((instr & 0x820) ==
35345                                                       0x20) ||
35346                                                      ((instr & 0x420) ==
35347                                                       0x20) ||
35348                                                      ((instr & 0x220) ==
35349                                                       0x20) ||
35350                                                      ((instr & 0x120) ==
35351                                                       0x120)) {
35352                                                    UnallocatedT32(instr);
35353                                                    return;
35354                                                  }
35355                                                  unsigned cmode =
35356                                                      ((instr >> 8) & 0xf) |
35357                                                      ((instr >> 1) & 0x10);
35358                                                  DataType dt =
35359                                                      ImmediateVmov::DecodeDt(
35360                                                          cmode);
35361                                                  if (dt.Is(
35362                                                          kDataTypeValueInvalid)) {
35363                                                    UnallocatedT32(instr);
35364                                                    return;
35365                                                  }
35366                                                  unsigned rd =
35367                                                      ExtractDRegister(instr,
35368                                                                       22,
35369                                                                       12);
35370                                                  DOperand imm = ImmediateVmov::
35371                                                      DecodeImmediate(
35372                                                          cmode,
35373                                                          (instr & 0xf) |
35374                                                              ((instr >> 12) &
35375                                                               0x70) |
35376                                                              ((instr >> 21) &
35377                                                               0x80));
35378                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35379                                                  vmov(CurrentCond(),
35380                                                       dt,
35381                                                       DRegister(rd),
35382                                                       imm);
35383                                                  break;
35384                                                }
35385                                                case 0x00000420: {
35386                                                  // 0xef800c30
35387                                                  if (((instr & 0xd00) ==
35388                                                       0x100) ||
35389                                                      ((instr & 0xd00) ==
35390                                                       0x500) ||
35391                                                      ((instr & 0xd00) ==
35392                                                       0x900) ||
35393                                                      ((instr & 0xe00) ==
35394                                                       0xe00)) {
35395                                                    UnallocatedT32(instr);
35396                                                    return;
35397                                                  }
35398                                                  unsigned cmode =
35399                                                      (instr >> 8) & 0xf;
35400                                                  DataType dt =
35401                                                      ImmediateVmvn::DecodeDt(
35402                                                          cmode);
35403                                                  if (dt.Is(
35404                                                          kDataTypeValueInvalid)) {
35405                                                    UnallocatedT32(instr);
35406                                                    return;
35407                                                  }
35408                                                  unsigned rd =
35409                                                      ExtractDRegister(instr,
35410                                                                       22,
35411                                                                       12);
35412                                                  DOperand imm = ImmediateVmvn::
35413                                                      DecodeImmediate(
35414                                                          cmode,
35415                                                          (instr & 0xf) |
35416                                                              ((instr >> 12) &
35417                                                               0x70) |
35418                                                              ((instr >> 21) &
35419                                                               0x80));
35420                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35421                                                  vmvn(CurrentCond(),
35422                                                       dt,
35423                                                       DRegister(rd),
35424                                                       imm);
35425                                                  break;
35426                                                }
35427                                                case 0x00000600: {
35428                                                  // 0xef800e10
35429                                                  if (((instr & 0x920) ==
35430                                                       0x100) ||
35431                                                      ((instr & 0x520) ==
35432                                                       0x100) ||
35433                                                      ((instr & 0x820) ==
35434                                                       0x20) ||
35435                                                      ((instr & 0x420) ==
35436                                                       0x20) ||
35437                                                      ((instr & 0x220) ==
35438                                                       0x20) ||
35439                                                      ((instr & 0x120) ==
35440                                                       0x120)) {
35441                                                    UnallocatedT32(instr);
35442                                                    return;
35443                                                  }
35444                                                  unsigned cmode =
35445                                                      ((instr >> 8) & 0xf) |
35446                                                      ((instr >> 1) & 0x10);
35447                                                  DataType dt =
35448                                                      ImmediateVmov::DecodeDt(
35449                                                          cmode);
35450                                                  if (dt.Is(
35451                                                          kDataTypeValueInvalid)) {
35452                                                    UnallocatedT32(instr);
35453                                                    return;
35454                                                  }
35455                                                  unsigned rd =
35456                                                      ExtractDRegister(instr,
35457                                                                       22,
35458                                                                       12);
35459                                                  DOperand imm = ImmediateVmov::
35460                                                      DecodeImmediate(
35461                                                          cmode,
35462                                                          (instr & 0xf) |
35463                                                              ((instr >> 12) &
35464                                                               0x70) |
35465                                                              ((instr >> 21) &
35466                                                               0x80));
35467                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35468                                                  vmov(CurrentCond(),
35469                                                       dt,
35470                                                       DRegister(rd),
35471                                                       imm);
35472                                                  break;
35473                                                }
35474                                                case 0x00000620: {
35475                                                  // 0xef800e30
35476                                                  if (((instr & 0xd00) ==
35477                                                       0x100) ||
35478                                                      ((instr & 0xd00) ==
35479                                                       0x500) ||
35480                                                      ((instr & 0xd00) ==
35481                                                       0x900) ||
35482                                                      ((instr & 0xe00) ==
35483                                                       0xe00)) {
35484                                                    UnallocatedT32(instr);
35485                                                    return;
35486                                                  }
35487                                                  unsigned cmode =
35488                                                      (instr >> 8) & 0xf;
35489                                                  DataType dt =
35490                                                      ImmediateVmvn::DecodeDt(
35491                                                          cmode);
35492                                                  if (dt.Is(
35493                                                          kDataTypeValueInvalid)) {
35494                                                    UnallocatedT32(instr);
35495                                                    return;
35496                                                  }
35497                                                  unsigned rd =
35498                                                      ExtractDRegister(instr,
35499                                                                       22,
35500                                                                       12);
35501                                                  DOperand imm = ImmediateVmvn::
35502                                                      DecodeImmediate(
35503                                                          cmode,
35504                                                          (instr & 0xf) |
35505                                                              ((instr >> 12) &
35506                                                               0x70) |
35507                                                              ((instr >> 21) &
35508                                                               0x80));
35509                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35510                                                  vmvn(CurrentCond(),
35511                                                       dt,
35512                                                       DRegister(rd),
35513                                                       imm);
35514                                                  break;
35515                                                }
35516                                                case 0x00000800: {
35517                                                  // 0xef800c10
35518                                                  if (((instr & 0x920) ==
35519                                                       0x100) ||
35520                                                      ((instr & 0x520) ==
35521                                                       0x100) ||
35522                                                      ((instr & 0x820) ==
35523                                                       0x20) ||
35524                                                      ((instr & 0x420) ==
35525                                                       0x20) ||
35526                                                      ((instr & 0x220) ==
35527                                                       0x20) ||
35528                                                      ((instr & 0x120) ==
35529                                                       0x120)) {
35530                                                    UnallocatedT32(instr);
35531                                                    return;
35532                                                  }
35533                                                  unsigned cmode =
35534                                                      ((instr >> 8) & 0xf) |
35535                                                      ((instr >> 1) & 0x10);
35536                                                  DataType dt =
35537                                                      ImmediateVmov::DecodeDt(
35538                                                          cmode);
35539                                                  if (dt.Is(
35540                                                          kDataTypeValueInvalid)) {
35541                                                    UnallocatedT32(instr);
35542                                                    return;
35543                                                  }
35544                                                  unsigned rd =
35545                                                      ExtractDRegister(instr,
35546                                                                       22,
35547                                                                       12);
35548                                                  DOperand imm = ImmediateVmov::
35549                                                      DecodeImmediate(
35550                                                          cmode,
35551                                                          (instr & 0xf) |
35552                                                              ((instr >> 12) &
35553                                                               0x70) |
35554                                                              ((instr >> 21) &
35555                                                               0x80));
35556                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35557                                                  vmov(CurrentCond(),
35558                                                       dt,
35559                                                       DRegister(rd),
35560                                                       imm);
35561                                                  break;
35562                                                }
35563                                                case 0x00000820: {
35564                                                  // 0xef800c30
35565                                                  if (((instr & 0xd00) ==
35566                                                       0x100) ||
35567                                                      ((instr & 0xd00) ==
35568                                                       0x500) ||
35569                                                      ((instr & 0xd00) ==
35570                                                       0x900) ||
35571                                                      ((instr & 0xe00) ==
35572                                                       0xe00)) {
35573                                                    UnallocatedT32(instr);
35574                                                    return;
35575                                                  }
35576                                                  unsigned cmode =
35577                                                      (instr >> 8) & 0xf;
35578                                                  DataType dt =
35579                                                      ImmediateVmvn::DecodeDt(
35580                                                          cmode);
35581                                                  if (dt.Is(
35582                                                          kDataTypeValueInvalid)) {
35583                                                    UnallocatedT32(instr);
35584                                                    return;
35585                                                  }
35586                                                  unsigned rd =
35587                                                      ExtractDRegister(instr,
35588                                                                       22,
35589                                                                       12);
35590                                                  DOperand imm = ImmediateVmvn::
35591                                                      DecodeImmediate(
35592                                                          cmode,
35593                                                          (instr & 0xf) |
35594                                                              ((instr >> 12) &
35595                                                               0x70) |
35596                                                              ((instr >> 21) &
35597                                                               0x80));
35598                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35599                                                  vmvn(CurrentCond(),
35600                                                       dt,
35601                                                       DRegister(rd),
35602                                                       imm);
35603                                                  break;
35604                                                }
35605                                                case 0x00000a00: {
35606                                                  // 0xef800e10
35607                                                  if (((instr & 0x920) ==
35608                                                       0x100) ||
35609                                                      ((instr & 0x520) ==
35610                                                       0x100) ||
35611                                                      ((instr & 0x820) ==
35612                                                       0x20) ||
35613                                                      ((instr & 0x420) ==
35614                                                       0x20) ||
35615                                                      ((instr & 0x220) ==
35616                                                       0x20) ||
35617                                                      ((instr & 0x120) ==
35618                                                       0x120)) {
35619                                                    UnallocatedT32(instr);
35620                                                    return;
35621                                                  }
35622                                                  unsigned cmode =
35623                                                      ((instr >> 8) & 0xf) |
35624                                                      ((instr >> 1) & 0x10);
35625                                                  DataType dt =
35626                                                      ImmediateVmov::DecodeDt(
35627                                                          cmode);
35628                                                  if (dt.Is(
35629                                                          kDataTypeValueInvalid)) {
35630                                                    UnallocatedT32(instr);
35631                                                    return;
35632                                                  }
35633                                                  unsigned rd =
35634                                                      ExtractDRegister(instr,
35635                                                                       22,
35636                                                                       12);
35637                                                  DOperand imm = ImmediateVmov::
35638                                                      DecodeImmediate(
35639                                                          cmode,
35640                                                          (instr & 0xf) |
35641                                                              ((instr >> 12) &
35642                                                               0x70) |
35643                                                              ((instr >> 21) &
35644                                                               0x80));
35645                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35646                                                  vmov(CurrentCond(),
35647                                                       dt,
35648                                                       DRegister(rd),
35649                                                       imm);
35650                                                  break;
35651                                                }
35652                                                case 0x00000a20: {
35653                                                  // 0xef800e30
35654                                                  if (((instr & 0xd00) ==
35655                                                       0x100) ||
35656                                                      ((instr & 0xd00) ==
35657                                                       0x500) ||
35658                                                      ((instr & 0xd00) ==
35659                                                       0x900) ||
35660                                                      ((instr & 0xe00) ==
35661                                                       0xe00)) {
35662                                                    UnallocatedT32(instr);
35663                                                    return;
35664                                                  }
35665                                                  unsigned cmode =
35666                                                      (instr >> 8) & 0xf;
35667                                                  DataType dt =
35668                                                      ImmediateVmvn::DecodeDt(
35669                                                          cmode);
35670                                                  if (dt.Is(
35671                                                          kDataTypeValueInvalid)) {
35672                                                    UnallocatedT32(instr);
35673                                                    return;
35674                                                  }
35675                                                  unsigned rd =
35676                                                      ExtractDRegister(instr,
35677                                                                       22,
35678                                                                       12);
35679                                                  DOperand imm = ImmediateVmvn::
35680                                                      DecodeImmediate(
35681                                                          cmode,
35682                                                          (instr & 0xf) |
35683                                                              ((instr >> 12) &
35684                                                               0x70) |
35685                                                              ((instr >> 21) &
35686                                                               0x80));
35687                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35688                                                  vmvn(CurrentCond(),
35689                                                       dt,
35690                                                       DRegister(rd),
35691                                                       imm);
35692                                                  break;
35693                                                }
35694                                                case 0x00000c00: {
35695                                                  // 0xef800c10
35696                                                  if (((instr & 0x920) ==
35697                                                       0x100) ||
35698                                                      ((instr & 0x520) ==
35699                                                       0x100) ||
35700                                                      ((instr & 0x820) ==
35701                                                       0x20) ||
35702                                                      ((instr & 0x420) ==
35703                                                       0x20) ||
35704                                                      ((instr & 0x220) ==
35705                                                       0x20) ||
35706                                                      ((instr & 0x120) ==
35707                                                       0x120)) {
35708                                                    UnallocatedT32(instr);
35709                                                    return;
35710                                                  }
35711                                                  unsigned cmode =
35712                                                      ((instr >> 8) & 0xf) |
35713                                                      ((instr >> 1) & 0x10);
35714                                                  DataType dt =
35715                                                      ImmediateVmov::DecodeDt(
35716                                                          cmode);
35717                                                  if (dt.Is(
35718                                                          kDataTypeValueInvalid)) {
35719                                                    UnallocatedT32(instr);
35720                                                    return;
35721                                                  }
35722                                                  unsigned rd =
35723                                                      ExtractDRegister(instr,
35724                                                                       22,
35725                                                                       12);
35726                                                  DOperand imm = ImmediateVmov::
35727                                                      DecodeImmediate(
35728                                                          cmode,
35729                                                          (instr & 0xf) |
35730                                                              ((instr >> 12) &
35731                                                               0x70) |
35732                                                              ((instr >> 21) &
35733                                                               0x80));
35734                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35735                                                  vmov(CurrentCond(),
35736                                                       dt,
35737                                                       DRegister(rd),
35738                                                       imm);
35739                                                  break;
35740                                                }
35741                                                case 0x00000c20: {
35742                                                  // 0xef800c30
35743                                                  if (((instr & 0xd00) ==
35744                                                       0x100) ||
35745                                                      ((instr & 0xd00) ==
35746                                                       0x500) ||
35747                                                      ((instr & 0xd00) ==
35748                                                       0x900) ||
35749                                                      ((instr & 0xe00) ==
35750                                                       0xe00)) {
35751                                                    UnallocatedT32(instr);
35752                                                    return;
35753                                                  }
35754                                                  unsigned cmode =
35755                                                      (instr >> 8) & 0xf;
35756                                                  DataType dt =
35757                                                      ImmediateVmvn::DecodeDt(
35758                                                          cmode);
35759                                                  if (dt.Is(
35760                                                          kDataTypeValueInvalid)) {
35761                                                    UnallocatedT32(instr);
35762                                                    return;
35763                                                  }
35764                                                  unsigned rd =
35765                                                      ExtractDRegister(instr,
35766                                                                       22,
35767                                                                       12);
35768                                                  DOperand imm = ImmediateVmvn::
35769                                                      DecodeImmediate(
35770                                                          cmode,
35771                                                          (instr & 0xf) |
35772                                                              ((instr >> 12) &
35773                                                               0x70) |
35774                                                              ((instr >> 21) &
35775                                                               0x80));
35776                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35777                                                  vmvn(CurrentCond(),
35778                                                       dt,
35779                                                       DRegister(rd),
35780                                                       imm);
35781                                                  break;
35782                                                }
35783                                                case 0x00000d00: {
35784                                                  // 0xef800d10
35785                                                  if (((instr & 0x920) ==
35786                                                       0x100) ||
35787                                                      ((instr & 0x520) ==
35788                                                       0x100) ||
35789                                                      ((instr & 0x820) ==
35790                                                       0x20) ||
35791                                                      ((instr & 0x420) ==
35792                                                       0x20) ||
35793                                                      ((instr & 0x220) ==
35794                                                       0x20) ||
35795                                                      ((instr & 0x120) ==
35796                                                       0x120)) {
35797                                                    UnallocatedT32(instr);
35798                                                    return;
35799                                                  }
35800                                                  unsigned cmode =
35801                                                      ((instr >> 8) & 0xf) |
35802                                                      ((instr >> 1) & 0x10);
35803                                                  DataType dt =
35804                                                      ImmediateVmov::DecodeDt(
35805                                                          cmode);
35806                                                  if (dt.Is(
35807                                                          kDataTypeValueInvalid)) {
35808                                                    UnallocatedT32(instr);
35809                                                    return;
35810                                                  }
35811                                                  unsigned rd =
35812                                                      ExtractDRegister(instr,
35813                                                                       22,
35814                                                                       12);
35815                                                  DOperand imm = ImmediateVmov::
35816                                                      DecodeImmediate(
35817                                                          cmode,
35818                                                          (instr & 0xf) |
35819                                                              ((instr >> 12) &
35820                                                               0x70) |
35821                                                              ((instr >> 21) &
35822                                                               0x80));
35823                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35824                                                  vmov(CurrentCond(),
35825                                                       dt,
35826                                                       DRegister(rd),
35827                                                       imm);
35828                                                  break;
35829                                                }
35830                                                case 0x00000d20: {
35831                                                  // 0xef800d30
35832                                                  if (((instr & 0xd00) ==
35833                                                       0x100) ||
35834                                                      ((instr & 0xd00) ==
35835                                                       0x500) ||
35836                                                      ((instr & 0xd00) ==
35837                                                       0x900) ||
35838                                                      ((instr & 0xe00) ==
35839                                                       0xe00)) {
35840                                                    UnallocatedT32(instr);
35841                                                    return;
35842                                                  }
35843                                                  unsigned cmode =
35844                                                      (instr >> 8) & 0xf;
35845                                                  DataType dt =
35846                                                      ImmediateVmvn::DecodeDt(
35847                                                          cmode);
35848                                                  if (dt.Is(
35849                                                          kDataTypeValueInvalid)) {
35850                                                    UnallocatedT32(instr);
35851                                                    return;
35852                                                  }
35853                                                  unsigned rd =
35854                                                      ExtractDRegister(instr,
35855                                                                       22,
35856                                                                       12);
35857                                                  DOperand imm = ImmediateVmvn::
35858                                                      DecodeImmediate(
35859                                                          cmode,
35860                                                          (instr & 0xf) |
35861                                                              ((instr >> 12) &
35862                                                               0x70) |
35863                                                              ((instr >> 21) &
35864                                                               0x80));
35865                                                  // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35866                                                  vmvn(CurrentCond(),
35867                                                       dt,
35868                                                       DRegister(rd),
35869                                                       imm);
35870                                                  break;
35871                                                }
35872                                                case 0x00000e00: {
35873                                                  // 0xef800e10
35874                                                  if (((instr & 0x920) ==
35875                                                       0x100) ||
35876                                                      ((instr & 0x520) ==
35877                                                       0x100) ||
35878                                                      ((instr & 0x820) ==
35879                                                       0x20) ||
35880                                                      ((instr & 0x420) ==
35881                                                       0x20) ||
35882                                                      ((instr & 0x220) ==
35883                                                       0x20) ||
35884                                                      ((instr & 0x120) ==
35885                                                       0x120)) {
35886                                                    UnallocatedT32(instr);
35887                                                    return;
35888                                                  }
35889                                                  unsigned cmode =
35890                                                      ((instr >> 8) & 0xf) |
35891                                                      ((instr >> 1) & 0x10);
35892                                                  DataType dt =
35893                                                      ImmediateVmov::DecodeDt(
35894                                                          cmode);
35895                                                  if (dt.Is(
35896                                                          kDataTypeValueInvalid)) {
35897                                                    UnallocatedT32(instr);
35898                                                    return;
35899                                                  }
35900                                                  unsigned rd =
35901                                                      ExtractDRegister(instr,
35902                                                                       22,
35903                                                                       12);
35904                                                  DOperand imm = ImmediateVmov::
35905                                                      DecodeImmediate(
35906                                                          cmode,
35907                                                          (instr & 0xf) |
35908                                                              ((instr >> 12) &
35909                                                               0x70) |
35910                                                              ((instr >> 21) &
35911                                                               0x80));
35912                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35913                                                  vmov(CurrentCond(),
35914                                                       dt,
35915                                                       DRegister(rd),
35916                                                       imm);
35917                                                  break;
35918                                                }
35919                                                case 0x00000e20: {
35920                                                  // 0xef800e30
35921                                                  if (((instr & 0x920) ==
35922                                                       0x100) ||
35923                                                      ((instr & 0x520) ==
35924                                                       0x100) ||
35925                                                      ((instr & 0x820) ==
35926                                                       0x20) ||
35927                                                      ((instr & 0x420) ==
35928                                                       0x20) ||
35929                                                      ((instr & 0x220) ==
35930                                                       0x20) ||
35931                                                      ((instr & 0x120) ==
35932                                                       0x120)) {
35933                                                    UnallocatedT32(instr);
35934                                                    return;
35935                                                  }
35936                                                  unsigned cmode =
35937                                                      ((instr >> 8) & 0xf) |
35938                                                      ((instr >> 1) & 0x10);
35939                                                  DataType dt =
35940                                                      ImmediateVmov::DecodeDt(
35941                                                          cmode);
35942                                                  if (dt.Is(
35943                                                          kDataTypeValueInvalid)) {
35944                                                    UnallocatedT32(instr);
35945                                                    return;
35946                                                  }
35947                                                  unsigned rd =
35948                                                      ExtractDRegister(instr,
35949                                                                       22,
35950                                                                       12);
35951                                                  DOperand imm = ImmediateVmov::
35952                                                      DecodeImmediate(
35953                                                          cmode,
35954                                                          (instr & 0xf) |
35955                                                              ((instr >> 12) &
35956                                                               0x70) |
35957                                                              ((instr >> 21) &
35958                                                               0x80));
35959                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35960                                                  vmov(CurrentCond(),
35961                                                       dt,
35962                                                       DRegister(rd),
35963                                                       imm);
35964                                                  break;
35965                                                }
35966                                                case 0x00000f00: {
35967                                                  // 0xef800f10
35968                                                  if (((instr & 0x920) ==
35969                                                       0x100) ||
35970                                                      ((instr & 0x520) ==
35971                                                       0x100) ||
35972                                                      ((instr & 0x820) ==
35973                                                       0x20) ||
35974                                                      ((instr & 0x420) ==
35975                                                       0x20) ||
35976                                                      ((instr & 0x220) ==
35977                                                       0x20) ||
35978                                                      ((instr & 0x120) ==
35979                                                       0x120)) {
35980                                                    UnallocatedT32(instr);
35981                                                    return;
35982                                                  }
35983                                                  unsigned cmode =
35984                                                      ((instr >> 8) & 0xf) |
35985                                                      ((instr >> 1) & 0x10);
35986                                                  DataType dt =
35987                                                      ImmediateVmov::DecodeDt(
35988                                                          cmode);
35989                                                  if (dt.Is(
35990                                                          kDataTypeValueInvalid)) {
35991                                                    UnallocatedT32(instr);
35992                                                    return;
35993                                                  }
35994                                                  unsigned rd =
35995                                                      ExtractDRegister(instr,
35996                                                                       22,
35997                                                                       12);
35998                                                  DOperand imm = ImmediateVmov::
35999                                                      DecodeImmediate(
36000                                                          cmode,
36001                                                          (instr & 0xf) |
36002                                                              ((instr >> 12) &
36003                                                               0x70) |
36004                                                              ((instr >> 21) &
36005                                                               0x80));
36006                                                  // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36007                                                  vmov(CurrentCond(),
36008                                                       dt,
36009                                                       DRegister(rd),
36010                                                       imm);
36011                                                  break;
36012                                                }
36013                                                default:
36014                                                  UnallocatedT32(instr);
36015                                                  break;
36016                                              }
36017                                              break;
36018                                            }
36019                                            default: {
36020                                              if (((instr & 0x920) == 0x100) ||
36021                                                  ((instr & 0x520) == 0x100) ||
36022                                                  ((instr & 0x820) == 0x20) ||
36023                                                  ((instr & 0x420) == 0x20) ||
36024                                                  ((instr & 0x220) == 0x20) ||
36025                                                  ((instr & 0x120) == 0x120)) {
36026                                                UnallocatedT32(instr);
36027                                                return;
36028                                              }
36029                                              unsigned cmode =
36030                                                  ((instr >> 8) & 0xf) |
36031                                                  ((instr >> 1) & 0x10);
36032                                              DataType dt =
36033                                                  ImmediateVmov::DecodeDt(
36034                                                      cmode);
36035                                              if (dt.Is(
36036                                                      kDataTypeValueInvalid)) {
36037                                                UnallocatedT32(instr);
36038                                                return;
36039                                              }
36040                                              unsigned rd =
36041                                                  ExtractDRegister(instr,
36042                                                                   22,
36043                                                                   12);
36044                                              DOperand imm = ImmediateVmov::
36045                                                  DecodeImmediate(cmode,
36046                                                                  (instr &
36047                                                                   0xf) |
36048                                                                      ((instr >>
36049                                                                        12) &
36050                                                                       0x70) |
36051                                                                      ((instr >>
36052                                                                        21) &
36053                                                                       0x80));
36054                                              // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36055                                              vmov(CurrentCond(),
36056                                                   dt,
36057                                                   DRegister(rd),
36058                                                   imm);
36059                                              break;
36060                                            }
36061                                          }
36062                                          break;
36063                                        }
36064                                      }
36065                                      break;
36066                                    }
36067                                    default:
36068                                      UnallocatedT32(instr);
36069                                      break;
36070                                  }
36071                                  break;
36072                                }
36073                                default: {
36074                                  if ((instr & 0x00000200) == 0x00000200) {
36075                                    if (((instr & 0x200000) == 0x0)) {
36076                                      UnallocatedT32(instr);
36077                                      return;
36078                                    }
36079                                    DataType dt1 = Dt_op_U_1_Decode1(
36080                                        ((instr >> 28) & 0x1) |
36081                                        ((instr >> 7) & 0x2));
36082                                    if (dt1.Is(kDataTypeValueInvalid)) {
36083                                      UnallocatedT32(instr);
36084                                      return;
36085                                    }
36086                                    DataType dt2 = Dt_op_U_1_Decode2(
36087                                        ((instr >> 28) & 0x1) |
36088                                        ((instr >> 7) & 0x2));
36089                                    if (dt2.Is(kDataTypeValueInvalid)) {
36090                                      UnallocatedT32(instr);
36091                                      return;
36092                                    }
36093                                    unsigned rd =
36094                                        ExtractDRegister(instr, 22, 12);
36095                                    unsigned rm = ExtractDRegister(instr, 5, 0);
36096                                    uint32_t fbits =
36097                                        64 - ((instr >> 16) & 0x3f);
36098                                    // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
36099                                    vcvt(CurrentCond(),
36100                                         dt1,
36101                                         dt2,
36102                                         DRegister(rd),
36103                                         DRegister(rm),
36104                                         fbits);
36105                                  } else {
36106                                    UnallocatedT32(instr);
36107                                  }
36108                                  break;
36109                                }
36110                              }
36111                              break;
36112                            }
36113                            default:
36114                              UnallocatedT32(instr);
36115                              break;
36116                          }
36117                          break;
36118                        }
36119                      }
36120                      break;
36121                    }
36122                    case 0x00800040: {
36123                      // 0xef800050
36124                      switch (instr & 0x00000c00) {
36125                        case 0x00000000: {
36126                          // 0xef800050
36127                          switch (instr & 0x00380080) {
36128                            case 0x00000000: {
36129                              // 0xef800050
36130                              switch (instr & 0x00000100) {
36131                                case 0x00000000: {
36132                                  // 0xef800050
36133                                  switch (instr & 0x00000200) {
36134                                    default: {
36135                                      switch (instr & 0x00000020) {
36136                                        case 0x00000020: {
36137                                          // 0xef800070
36138                                          if (((instr & 0xd00) == 0x100) ||
36139                                              ((instr & 0xd00) == 0x500) ||
36140                                              ((instr & 0xd00) == 0x900) ||
36141                                              ((instr & 0xe00) == 0xe00)) {
36142                                            UnallocatedT32(instr);
36143                                            return;
36144                                          }
36145                                          unsigned cmode = (instr >> 8) & 0xf;
36146                                          DataType dt =
36147                                              ImmediateVmvn::DecodeDt(cmode);
36148                                          if (dt.Is(kDataTypeValueInvalid)) {
36149                                            UnallocatedT32(instr);
36150                                            return;
36151                                          }
36152                                          if (((instr >> 12) & 1) != 0) {
36153                                            UnallocatedT32(instr);
36154                                            return;
36155                                          }
36156                                          unsigned rd =
36157                                              ExtractQRegister(instr, 22, 12);
36158                                          QOperand imm =
36159                                              ImmediateVmvn::DecodeImmediate(
36160                                                  cmode,
36161                                                  (instr & 0xf) |
36162                                                      ((instr >> 12) & 0x70) |
36163                                                      ((instr >> 21) & 0x80));
36164                                          // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36165                                          vmvn(CurrentCond(),
36166                                               dt,
36167                                               QRegister(rd),
36168                                               imm);
36169                                          break;
36170                                        }
36171                                        default: {
36172                                          if (((instr & 0x920) == 0x100) ||
36173                                              ((instr & 0x520) == 0x100) ||
36174                                              ((instr & 0x820) == 0x20) ||
36175                                              ((instr & 0x420) == 0x20) ||
36176                                              ((instr & 0x220) == 0x20) ||
36177                                              ((instr & 0x120) == 0x120)) {
36178                                            UnallocatedT32(instr);
36179                                            return;
36180                                          }
36181                                          unsigned cmode =
36182                                              ((instr >> 8) & 0xf) |
36183                                              ((instr >> 1) & 0x10);
36184                                          DataType dt =
36185                                              ImmediateVmov::DecodeDt(cmode);
36186                                          if (dt.Is(kDataTypeValueInvalid)) {
36187                                            UnallocatedT32(instr);
36188                                            return;
36189                                          }
36190                                          if (((instr >> 12) & 1) != 0) {
36191                                            UnallocatedT32(instr);
36192                                            return;
36193                                          }
36194                                          unsigned rd =
36195                                              ExtractQRegister(instr, 22, 12);
36196                                          QOperand imm =
36197                                              ImmediateVmov::DecodeImmediate(
36198                                                  cmode,
36199                                                  (instr & 0xf) |
36200                                                      ((instr >> 12) & 0x70) |
36201                                                      ((instr >> 21) & 0x80));
36202                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36203                                          vmov(CurrentCond(),
36204                                               dt,
36205                                               QRegister(rd),
36206                                               imm);
36207                                          break;
36208                                        }
36209                                      }
36210                                      break;
36211                                    }
36212                                  }
36213                                  break;
36214                                }
36215                                case 0x00000100: {
36216                                  // 0xef800150
36217                                  switch (instr & 0x00000020) {
36218                                    case 0x00000000: {
36219                                      // 0xef800150
36220                                      if (((instr & 0x100) == 0x0) ||
36221                                          ((instr & 0xc00) == 0xc00)) {
36222                                        UnallocatedT32(instr);
36223                                        return;
36224                                      }
36225                                      unsigned cmode = (instr >> 8) & 0xf;
36226                                      DataType dt =
36227                                          ImmediateVorr::DecodeDt(cmode);
36228                                      if (dt.Is(kDataTypeValueInvalid)) {
36229                                        UnallocatedT32(instr);
36230                                        return;
36231                                      }
36232                                      if (((instr >> 12) & 1) != 0) {
36233                                        UnallocatedT32(instr);
36234                                        return;
36235                                      }
36236                                      unsigned rd =
36237                                          ExtractQRegister(instr, 22, 12);
36238                                      QOperand imm =
36239                                          ImmediateVorr::DecodeImmediate(
36240                                              cmode,
36241                                              (instr & 0xf) |
36242                                                  ((instr >> 12) & 0x70) |
36243                                                  ((instr >> 21) & 0x80));
36244                                      // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36245                                      vorr(CurrentCond(),
36246                                           dt,
36247                                           QRegister(rd),
36248                                           QRegister(rd),
36249                                           imm);
36250                                      break;
36251                                    }
36252                                    case 0x00000020: {
36253                                      // 0xef800170
36254                                      if (((instr & 0x100) == 0x0) ||
36255                                          ((instr & 0xc00) == 0xc00)) {
36256                                        UnallocatedT32(instr);
36257                                        return;
36258                                      }
36259                                      unsigned cmode = (instr >> 8) & 0xf;
36260                                      DataType dt =
36261                                          ImmediateVbic::DecodeDt(cmode);
36262                                      if (dt.Is(kDataTypeValueInvalid)) {
36263                                        UnallocatedT32(instr);
36264                                        return;
36265                                      }
36266                                      if (((instr >> 12) & 1) != 0) {
36267                                        UnallocatedT32(instr);
36268                                        return;
36269                                      }
36270                                      unsigned rd =
36271                                          ExtractQRegister(instr, 22, 12);
36272                                      QOperand imm =
36273                                          ImmediateVbic::DecodeImmediate(
36274                                              cmode,
36275                                              (instr & 0xf) |
36276                                                  ((instr >> 12) & 0x70) |
36277                                                  ((instr >> 21) & 0x80));
36278                                      // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36279                                      vbic(CurrentCond(),
36280                                           dt,
36281                                           QRegister(rd),
36282                                           QRegister(rd),
36283                                           imm);
36284                                      break;
36285                                    }
36286                                  }
36287                                  break;
36288                                }
36289                              }
36290                              break;
36291                            }
36292                            default: {
36293                              switch (instr & 0x00000300) {
36294                                case 0x00000000: {
36295                                  // 0xef800050
36296                                  if (((instr & 0x380080) == 0x0)) {
36297                                    UnallocatedT32(instr);
36298                                    return;
36299                                  }
36300                                  DataType dt =
36301                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36302                                                             ((instr >> 4) &
36303                                                              0x8),
36304                                                         (instr >> 28) & 0x1);
36305                                  if (dt.Is(kDataTypeValueInvalid)) {
36306                                    UnallocatedT32(instr);
36307                                    return;
36308                                  }
36309                                  if (((instr >> 12) & 1) != 0) {
36310                                    UnallocatedT32(instr);
36311                                    return;
36312                                  }
36313                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36314                                  if ((instr & 1) != 0) {
36315                                    UnallocatedT32(instr);
36316                                    return;
36317                                  }
36318                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36319                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36320                                  uint32_t imm =
36321                                      (dt.IsSize(64) ? 64
36322                                                     : (dt.GetSize() * 2)) -
36323                                      imm6;
36324                                  // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36325                                  vshr(CurrentCond(),
36326                                       dt,
36327                                       QRegister(rd),
36328                                       QRegister(rm),
36329                                       imm);
36330                                  break;
36331                                }
36332                                case 0x00000100: {
36333                                  // 0xef800150
36334                                  if (((instr & 0x380080) == 0x0)) {
36335                                    UnallocatedT32(instr);
36336                                    return;
36337                                  }
36338                                  DataType dt =
36339                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36340                                                             ((instr >> 4) &
36341                                                              0x8),
36342                                                         (instr >> 28) & 0x1);
36343                                  if (dt.Is(kDataTypeValueInvalid)) {
36344                                    UnallocatedT32(instr);
36345                                    return;
36346                                  }
36347                                  if (((instr >> 12) & 1) != 0) {
36348                                    UnallocatedT32(instr);
36349                                    return;
36350                                  }
36351                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36352                                  if ((instr & 1) != 0) {
36353                                    UnallocatedT32(instr);
36354                                    return;
36355                                  }
36356                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36357                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36358                                  uint32_t imm =
36359                                      (dt.IsSize(64) ? 64
36360                                                     : (dt.GetSize() * 2)) -
36361                                      imm6;
36362                                  // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36363                                  vsra(CurrentCond(),
36364                                       dt,
36365                                       QRegister(rd),
36366                                       QRegister(rm),
36367                                       imm);
36368                                  break;
36369                                }
36370                                case 0x00000200: {
36371                                  // 0xef800250
36372                                  if (((instr & 0x380080) == 0x0)) {
36373                                    UnallocatedT32(instr);
36374                                    return;
36375                                  }
36376                                  DataType dt =
36377                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36378                                                             ((instr >> 4) &
36379                                                              0x8),
36380                                                         (instr >> 28) & 0x1);
36381                                  if (dt.Is(kDataTypeValueInvalid)) {
36382                                    UnallocatedT32(instr);
36383                                    return;
36384                                  }
36385                                  if (((instr >> 12) & 1) != 0) {
36386                                    UnallocatedT32(instr);
36387                                    return;
36388                                  }
36389                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36390                                  if ((instr & 1) != 0) {
36391                                    UnallocatedT32(instr);
36392                                    return;
36393                                  }
36394                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36395                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36396                                  uint32_t imm =
36397                                      (dt.IsSize(64) ? 64
36398                                                     : (dt.GetSize() * 2)) -
36399                                      imm6;
36400                                  // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36401                                  vrshr(CurrentCond(),
36402                                        dt,
36403                                        QRegister(rd),
36404                                        QRegister(rm),
36405                                        imm);
36406                                  break;
36407                                }
36408                                case 0x00000300: {
36409                                  // 0xef800350
36410                                  if (((instr & 0x380080) == 0x0)) {
36411                                    UnallocatedT32(instr);
36412                                    return;
36413                                  }
36414                                  DataType dt =
36415                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36416                                                             ((instr >> 4) &
36417                                                              0x8),
36418                                                         (instr >> 28) & 0x1);
36419                                  if (dt.Is(kDataTypeValueInvalid)) {
36420                                    UnallocatedT32(instr);
36421                                    return;
36422                                  }
36423                                  if (((instr >> 12) & 1) != 0) {
36424                                    UnallocatedT32(instr);
36425                                    return;
36426                                  }
36427                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36428                                  if ((instr & 1) != 0) {
36429                                    UnallocatedT32(instr);
36430                                    return;
36431                                  }
36432                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36433                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36434                                  uint32_t imm =
36435                                      (dt.IsSize(64) ? 64
36436                                                     : (dt.GetSize() * 2)) -
36437                                      imm6;
36438                                  // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36439                                  vrsra(CurrentCond(),
36440                                        dt,
36441                                        QRegister(rd),
36442                                        QRegister(rm),
36443                                        imm);
36444                                  break;
36445                                }
36446                              }
36447                              break;
36448                            }
36449                          }
36450                          break;
36451                        }
36452                        case 0x00000400: {
36453                          // 0xef800450
36454                          switch (instr & 0x00380080) {
36455                            case 0x00000000: {
36456                              // 0xef800450
36457                              switch (instr & 0x00000100) {
36458                                case 0x00000000: {
36459                                  // 0xef800450
36460                                  switch (instr & 0x00000200) {
36461                                    default: {
36462                                      switch (instr & 0x00000020) {
36463                                        case 0x00000020: {
36464                                          // 0xef800470
36465                                          if (((instr & 0xd00) == 0x100) ||
36466                                              ((instr & 0xd00) == 0x500) ||
36467                                              ((instr & 0xd00) == 0x900) ||
36468                                              ((instr & 0xe00) == 0xe00)) {
36469                                            UnallocatedT32(instr);
36470                                            return;
36471                                          }
36472                                          unsigned cmode = (instr >> 8) & 0xf;
36473                                          DataType dt =
36474                                              ImmediateVmvn::DecodeDt(cmode);
36475                                          if (dt.Is(kDataTypeValueInvalid)) {
36476                                            UnallocatedT32(instr);
36477                                            return;
36478                                          }
36479                                          if (((instr >> 12) & 1) != 0) {
36480                                            UnallocatedT32(instr);
36481                                            return;
36482                                          }
36483                                          unsigned rd =
36484                                              ExtractQRegister(instr, 22, 12);
36485                                          QOperand imm =
36486                                              ImmediateVmvn::DecodeImmediate(
36487                                                  cmode,
36488                                                  (instr & 0xf) |
36489                                                      ((instr >> 12) & 0x70) |
36490                                                      ((instr >> 21) & 0x80));
36491                                          // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36492                                          vmvn(CurrentCond(),
36493                                               dt,
36494                                               QRegister(rd),
36495                                               imm);
36496                                          break;
36497                                        }
36498                                        default: {
36499                                          if (((instr & 0x920) == 0x100) ||
36500                                              ((instr & 0x520) == 0x100) ||
36501                                              ((instr & 0x820) == 0x20) ||
36502                                              ((instr & 0x420) == 0x20) ||
36503                                              ((instr & 0x220) == 0x20) ||
36504                                              ((instr & 0x120) == 0x120)) {
36505                                            UnallocatedT32(instr);
36506                                            return;
36507                                          }
36508                                          unsigned cmode =
36509                                              ((instr >> 8) & 0xf) |
36510                                              ((instr >> 1) & 0x10);
36511                                          DataType dt =
36512                                              ImmediateVmov::DecodeDt(cmode);
36513                                          if (dt.Is(kDataTypeValueInvalid)) {
36514                                            UnallocatedT32(instr);
36515                                            return;
36516                                          }
36517                                          if (((instr >> 12) & 1) != 0) {
36518                                            UnallocatedT32(instr);
36519                                            return;
36520                                          }
36521                                          unsigned rd =
36522                                              ExtractQRegister(instr, 22, 12);
36523                                          QOperand imm =
36524                                              ImmediateVmov::DecodeImmediate(
36525                                                  cmode,
36526                                                  (instr & 0xf) |
36527                                                      ((instr >> 12) & 0x70) |
36528                                                      ((instr >> 21) & 0x80));
36529                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36530                                          vmov(CurrentCond(),
36531                                               dt,
36532                                               QRegister(rd),
36533                                               imm);
36534                                          break;
36535                                        }
36536                                      }
36537                                      break;
36538                                    }
36539                                  }
36540                                  break;
36541                                }
36542                                case 0x00000100: {
36543                                  // 0xef800550
36544                                  switch (instr & 0x00000020) {
36545                                    case 0x00000000: {
36546                                      // 0xef800550
36547                                      if (((instr & 0x100) == 0x0) ||
36548                                          ((instr & 0xc00) == 0xc00)) {
36549                                        UnallocatedT32(instr);
36550                                        return;
36551                                      }
36552                                      unsigned cmode = (instr >> 8) & 0xf;
36553                                      DataType dt =
36554                                          ImmediateVorr::DecodeDt(cmode);
36555                                      if (dt.Is(kDataTypeValueInvalid)) {
36556                                        UnallocatedT32(instr);
36557                                        return;
36558                                      }
36559                                      if (((instr >> 12) & 1) != 0) {
36560                                        UnallocatedT32(instr);
36561                                        return;
36562                                      }
36563                                      unsigned rd =
36564                                          ExtractQRegister(instr, 22, 12);
36565                                      QOperand imm =
36566                                          ImmediateVorr::DecodeImmediate(
36567                                              cmode,
36568                                              (instr & 0xf) |
36569                                                  ((instr >> 12) & 0x70) |
36570                                                  ((instr >> 21) & 0x80));
36571                                      // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36572                                      vorr(CurrentCond(),
36573                                           dt,
36574                                           QRegister(rd),
36575                                           QRegister(rd),
36576                                           imm);
36577                                      break;
36578                                    }
36579                                    case 0x00000020: {
36580                                      // 0xef800570
36581                                      if (((instr & 0x100) == 0x0) ||
36582                                          ((instr & 0xc00) == 0xc00)) {
36583                                        UnallocatedT32(instr);
36584                                        return;
36585                                      }
36586                                      unsigned cmode = (instr >> 8) & 0xf;
36587                                      DataType dt =
36588                                          ImmediateVbic::DecodeDt(cmode);
36589                                      if (dt.Is(kDataTypeValueInvalid)) {
36590                                        UnallocatedT32(instr);
36591                                        return;
36592                                      }
36593                                      if (((instr >> 12) & 1) != 0) {
36594                                        UnallocatedT32(instr);
36595                                        return;
36596                                      }
36597                                      unsigned rd =
36598                                          ExtractQRegister(instr, 22, 12);
36599                                      QOperand imm =
36600                                          ImmediateVbic::DecodeImmediate(
36601                                              cmode,
36602                                              (instr & 0xf) |
36603                                                  ((instr >> 12) & 0x70) |
36604                                                  ((instr >> 21) & 0x80));
36605                                      // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36606                                      vbic(CurrentCond(),
36607                                           dt,
36608                                           QRegister(rd),
36609                                           QRegister(rd),
36610                                           imm);
36611                                      break;
36612                                    }
36613                                  }
36614                                  break;
36615                                }
36616                              }
36617                              break;
36618                            }
36619                            default: {
36620                              switch (instr & 0x00000300) {
36621                                case 0x00000000: {
36622                                  // 0xef800450
36623                                  if ((instr & 0x10000000) == 0x10000000) {
36624                                    if (((instr & 0x380080) == 0x0)) {
36625                                      UnallocatedT32(instr);
36626                                      return;
36627                                    }
36628                                    DataType dt = Dt_L_imm6_4_Decode(
36629                                        ((instr >> 19) & 0x7) |
36630                                        ((instr >> 4) & 0x8));
36631                                    if (dt.Is(kDataTypeValueInvalid)) {
36632                                      UnallocatedT32(instr);
36633                                      return;
36634                                    }
36635                                    if (((instr >> 12) & 1) != 0) {
36636                                      UnallocatedT32(instr);
36637                                      return;
36638                                    }
36639                                    unsigned rd =
36640                                        ExtractQRegister(instr, 22, 12);
36641                                    if ((instr & 1) != 0) {
36642                                      UnallocatedT32(instr);
36643                                      return;
36644                                    }
36645                                    unsigned rm = ExtractQRegister(instr, 5, 0);
36646                                    uint32_t imm6 = (instr >> 16) & 0x3f;
36647                                    uint32_t imm =
36648                                        (dt.IsSize(64) ? 64
36649                                                       : (dt.GetSize() * 2)) -
36650                                        imm6;
36651                                    // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36652                                    vsri(CurrentCond(),
36653                                         dt,
36654                                         QRegister(rd),
36655                                         QRegister(rm),
36656                                         imm);
36657                                  } else {
36658                                    UnallocatedT32(instr);
36659                                  }
36660                                  break;
36661                                }
36662                                case 0x00000100: {
36663                                  // 0xef800550
36664                                  switch (instr & 0x10000000) {
36665                                    case 0x00000000: {
36666                                      // 0xef800550
36667                                      if (((instr & 0x380080) == 0x0)) {
36668                                        UnallocatedT32(instr);
36669                                        return;
36670                                      }
36671                                      DataType dt = Dt_L_imm6_3_Decode(
36672                                          ((instr >> 19) & 0x7) |
36673                                          ((instr >> 4) & 0x8));
36674                                      if (dt.Is(kDataTypeValueInvalid)) {
36675                                        UnallocatedT32(instr);
36676                                        return;
36677                                      }
36678                                      if (((instr >> 12) & 1) != 0) {
36679                                        UnallocatedT32(instr);
36680                                        return;
36681                                      }
36682                                      unsigned rd =
36683                                          ExtractQRegister(instr, 22, 12);
36684                                      if ((instr & 1) != 0) {
36685                                        UnallocatedT32(instr);
36686                                        return;
36687                                      }
36688                                      unsigned rm =
36689                                          ExtractQRegister(instr, 5, 0);
36690                                      uint32_t imm6 = (instr >> 16) & 0x3f;
36691                                      uint32_t imm =
36692                                          imm6 -
36693                                          (dt.IsSize(64) ? 0 : dt.GetSize());
36694                                      // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36695                                      vshl(CurrentCond(),
36696                                           dt,
36697                                           QRegister(rd),
36698                                           QRegister(rm),
36699                                           imm);
36700                                      break;
36701                                    }
36702                                    case 0x10000000: {
36703                                      // 0xff800550
36704                                      if (((instr & 0x380080) == 0x0)) {
36705                                        UnallocatedT32(instr);
36706                                        return;
36707                                      }
36708                                      DataType dt = Dt_L_imm6_4_Decode(
36709                                          ((instr >> 19) & 0x7) |
36710                                          ((instr >> 4) & 0x8));
36711                                      if (dt.Is(kDataTypeValueInvalid)) {
36712                                        UnallocatedT32(instr);
36713                                        return;
36714                                      }
36715                                      if (((instr >> 12) & 1) != 0) {
36716                                        UnallocatedT32(instr);
36717                                        return;
36718                                      }
36719                                      unsigned rd =
36720                                          ExtractQRegister(instr, 22, 12);
36721                                      if ((instr & 1) != 0) {
36722                                        UnallocatedT32(instr);
36723                                        return;
36724                                      }
36725                                      unsigned rm =
36726                                          ExtractQRegister(instr, 5, 0);
36727                                      uint32_t imm6 = (instr >> 16) & 0x3f;
36728                                      uint32_t imm =
36729                                          imm6 -
36730                                          (dt.IsSize(64) ? 0 : dt.GetSize());
36731                                      // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36732                                      vsli(CurrentCond(),
36733                                           dt,
36734                                           QRegister(rd),
36735                                           QRegister(rm),
36736                                           imm);
36737                                      break;
36738                                    }
36739                                  }
36740                                  break;
36741                                }
36742                                case 0x00000200: {
36743                                  // 0xef800650
36744                                  if (((instr & 0x380080) == 0x0)) {
36745                                    UnallocatedT32(instr);
36746                                    return;
36747                                  }
36748                                  DataType dt =
36749                                      Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
36750                                                             ((instr >> 4) &
36751                                                              0x8),
36752                                                         (instr >> 28) & 0x1);
36753                                  if (dt.Is(kDataTypeValueInvalid)) {
36754                                    UnallocatedT32(instr);
36755                                    return;
36756                                  }
36757                                  if (((instr >> 12) & 1) != 0) {
36758                                    UnallocatedT32(instr);
36759                                    return;
36760                                  }
36761                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36762                                  if ((instr & 1) != 0) {
36763                                    UnallocatedT32(instr);
36764                                    return;
36765                                  }
36766                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36767                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36768                                  uint32_t imm =
36769                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
36770                                  // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36771                                  vqshlu(CurrentCond(),
36772                                         dt,
36773                                         QRegister(rd),
36774                                         QRegister(rm),
36775                                         imm);
36776                                  break;
36777                                }
36778                                case 0x00000300: {
36779                                  // 0xef800750
36780                                  if (((instr & 0x380080) == 0x0)) {
36781                                    UnallocatedT32(instr);
36782                                    return;
36783                                  }
36784                                  DataType dt =
36785                                      Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36786                                                             ((instr >> 4) &
36787                                                              0x8),
36788                                                         (instr >> 28) & 0x1);
36789                                  if (dt.Is(kDataTypeValueInvalid)) {
36790                                    UnallocatedT32(instr);
36791                                    return;
36792                                  }
36793                                  if (((instr >> 12) & 1) != 0) {
36794                                    UnallocatedT32(instr);
36795                                    return;
36796                                  }
36797                                  unsigned rd = ExtractQRegister(instr, 22, 12);
36798                                  if ((instr & 1) != 0) {
36799                                    UnallocatedT32(instr);
36800                                    return;
36801                                  }
36802                                  unsigned rm = ExtractQRegister(instr, 5, 0);
36803                                  uint32_t imm6 = (instr >> 16) & 0x3f;
36804                                  uint32_t imm =
36805                                      imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
36806                                  // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36807                                  vqshl(CurrentCond(),
36808                                        dt,
36809                                        QRegister(rd),
36810                                        QRegister(rm),
36811                                        imm);
36812                                  break;
36813                                }
36814                              }
36815                              break;
36816                            }
36817                          }
36818                          break;
36819                        }
36820                        case 0x00000800: {
36821                          // 0xef800850
36822                          switch (instr & 0x00000080) {
36823                            case 0x00000000: {
36824                              // 0xef800850
36825                              switch (instr & 0x00380000) {
36826                                case 0x00000000: {
36827                                  // 0xef800850
36828                                  switch (instr & 0x00000100) {
36829                                    case 0x00000000: {
36830                                      // 0xef800850
36831                                      switch (instr & 0x00000200) {
36832                                        default: {
36833                                          switch (instr & 0x00000020) {
36834                                            case 0x00000020: {
36835                                              // 0xef800870
36836                                              if (((instr & 0xd00) == 0x100) ||
36837                                                  ((instr & 0xd00) == 0x500) ||
36838                                                  ((instr & 0xd00) == 0x900) ||
36839                                                  ((instr & 0xe00) == 0xe00)) {
36840                                                UnallocatedT32(instr);
36841                                                return;
36842                                              }
36843                                              unsigned cmode =
36844                                                  (instr >> 8) & 0xf;
36845                                              DataType dt =
36846                                                  ImmediateVmvn::DecodeDt(
36847                                                      cmode);
36848                                              if (dt.Is(
36849                                                      kDataTypeValueInvalid)) {
36850                                                UnallocatedT32(instr);
36851                                                return;
36852                                              }
36853                                              if (((instr >> 12) & 1) != 0) {
36854                                                UnallocatedT32(instr);
36855                                                return;
36856                                              }
36857                                              unsigned rd =
36858                                                  ExtractQRegister(instr,
36859                                                                   22,
36860                                                                   12);
36861                                              QOperand imm = ImmediateVmvn::
36862                                                  DecodeImmediate(cmode,
36863                                                                  (instr &
36864                                                                   0xf) |
36865                                                                      ((instr >>
36866                                                                        12) &
36867                                                                       0x70) |
36868                                                                      ((instr >>
36869                                                                        21) &
36870                                                                       0x80));
36871                                              // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36872                                              vmvn(CurrentCond(),
36873                                                   dt,
36874                                                   QRegister(rd),
36875                                                   imm);
36876                                              break;
36877                                            }
36878                                            default: {
36879                                              if (((instr & 0x920) == 0x100) ||
36880                                                  ((instr & 0x520) == 0x100) ||
36881                                                  ((instr & 0x820) == 0x20) ||
36882                                                  ((instr & 0x420) == 0x20) ||
36883                                                  ((instr & 0x220) == 0x20) ||
36884                                                  ((instr & 0x120) == 0x120)) {
36885                                                UnallocatedT32(instr);
36886                                                return;
36887                                              }
36888                                              unsigned cmode =
36889                                                  ((instr >> 8) & 0xf) |
36890                                                  ((instr >> 1) & 0x10);
36891                                              DataType dt =
36892                                                  ImmediateVmov::DecodeDt(
36893                                                      cmode);
36894                                              if (dt.Is(
36895                                                      kDataTypeValueInvalid)) {
36896                                                UnallocatedT32(instr);
36897                                                return;
36898                                              }
36899                                              if (((instr >> 12) & 1) != 0) {
36900                                                UnallocatedT32(instr);
36901                                                return;
36902                                              }
36903                                              unsigned rd =
36904                                                  ExtractQRegister(instr,
36905                                                                   22,
36906                                                                   12);
36907                                              QOperand imm = ImmediateVmov::
36908                                                  DecodeImmediate(cmode,
36909                                                                  (instr &
36910                                                                   0xf) |
36911                                                                      ((instr >>
36912                                                                        12) &
36913                                                                       0x70) |
36914                                                                      ((instr >>
36915                                                                        21) &
36916                                                                       0x80));
36917                                              // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36918                                              vmov(CurrentCond(),
36919                                                   dt,
36920                                                   QRegister(rd),
36921                                                   imm);
36922                                              break;
36923                                            }
36924                                          }
36925                                          break;
36926                                        }
36927                                      }
36928                                      break;
36929                                    }
36930                                    case 0x00000100: {
36931                                      // 0xef800950
36932                                      switch (instr & 0x00000020) {
36933                                        case 0x00000000: {
36934                                          // 0xef800950
36935                                          if (((instr & 0x100) == 0x0) ||
36936                                              ((instr & 0xc00) == 0xc00)) {
36937                                            UnallocatedT32(instr);
36938                                            return;
36939                                          }
36940                                          unsigned cmode = (instr >> 8) & 0xf;
36941                                          DataType dt =
36942                                              ImmediateVorr::DecodeDt(cmode);
36943                                          if (dt.Is(kDataTypeValueInvalid)) {
36944                                            UnallocatedT32(instr);
36945                                            return;
36946                                          }
36947                                          if (((instr >> 12) & 1) != 0) {
36948                                            UnallocatedT32(instr);
36949                                            return;
36950                                          }
36951                                          unsigned rd =
36952                                              ExtractQRegister(instr, 22, 12);
36953                                          QOperand imm =
36954                                              ImmediateVorr::DecodeImmediate(
36955                                                  cmode,
36956                                                  (instr & 0xf) |
36957                                                      ((instr >> 12) & 0x70) |
36958                                                      ((instr >> 21) & 0x80));
36959                                          // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36960                                          vorr(CurrentCond(),
36961                                               dt,
36962                                               QRegister(rd),
36963                                               QRegister(rd),
36964                                               imm);
36965                                          break;
36966                                        }
36967                                        case 0x00000020: {
36968                                          // 0xef800970
36969                                          if (((instr & 0x100) == 0x0) ||
36970                                              ((instr & 0xc00) == 0xc00)) {
36971                                            UnallocatedT32(instr);
36972                                            return;
36973                                          }
36974                                          unsigned cmode = (instr >> 8) & 0xf;
36975                                          DataType dt =
36976                                              ImmediateVbic::DecodeDt(cmode);
36977                                          if (dt.Is(kDataTypeValueInvalid)) {
36978                                            UnallocatedT32(instr);
36979                                            return;
36980                                          }
36981                                          if (((instr >> 12) & 1) != 0) {
36982                                            UnallocatedT32(instr);
36983                                            return;
36984                                          }
36985                                          unsigned rd =
36986                                              ExtractQRegister(instr, 22, 12);
36987                                          QOperand imm =
36988                                              ImmediateVbic::DecodeImmediate(
36989                                                  cmode,
36990                                                  (instr & 0xf) |
36991                                                      ((instr >> 12) & 0x70) |
36992                                                      ((instr >> 21) & 0x80));
36993                                          // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36994                                          vbic(CurrentCond(),
36995                                               dt,
36996                                               QRegister(rd),
36997                                               QRegister(rd),
36998                                               imm);
36999                                          break;
37000                                        }
37001                                      }
37002                                      break;
37003                                    }
37004                                  }
37005                                  break;
37006                                }
37007                                default: {
37008                                  switch (instr & 0x00000300) {
37009                                    case 0x00000000: {
37010                                      // 0xef800850
37011                                      switch (instr & 0x10000000) {
37012                                        case 0x00000000: {
37013                                          // 0xef800850
37014                                          if (((instr & 0x380000) == 0x0)) {
37015                                            UnallocatedT32(instr);
37016                                            return;
37017                                          }
37018                                          DataType dt = Dt_imm6_3_Decode(
37019                                              (instr >> 19) & 0x7);
37020                                          if (dt.Is(kDataTypeValueInvalid)) {
37021                                            UnallocatedT32(instr);
37022                                            return;
37023                                          }
37024                                          unsigned rd =
37025                                              ExtractDRegister(instr, 22, 12);
37026                                          if ((instr & 1) != 0) {
37027                                            UnallocatedT32(instr);
37028                                            return;
37029                                          }
37030                                          unsigned rm =
37031                                              ExtractQRegister(instr, 5, 0);
37032                                          uint32_t imm6 = (instr >> 16) & 0x3f;
37033                                          uint32_t imm = dt.GetSize() - imm6;
37034                                          // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37035                                          vrshrn(CurrentCond(),
37036                                                 dt,
37037                                                 DRegister(rd),
37038                                                 QRegister(rm),
37039                                                 imm);
37040                                          break;
37041                                        }
37042                                        case 0x10000000: {
37043                                          // 0xff800850
37044                                          if (((instr & 0x380000) == 0x0)) {
37045                                            UnallocatedT32(instr);
37046                                            return;
37047                                          }
37048                                          DataType dt =
37049                                              Dt_imm6_2_Decode((instr >> 19) &
37050                                                                   0x7,
37051                                                               (instr >> 28) &
37052                                                                   0x1);
37053                                          if (dt.Is(kDataTypeValueInvalid)) {
37054                                            UnallocatedT32(instr);
37055                                            return;
37056                                          }
37057                                          unsigned rd =
37058                                              ExtractDRegister(instr, 22, 12);
37059                                          if ((instr & 1) != 0) {
37060                                            UnallocatedT32(instr);
37061                                            return;
37062                                          }
37063                                          unsigned rm =
37064                                              ExtractQRegister(instr, 5, 0);
37065                                          uint32_t imm6 = (instr >> 16) & 0x3f;
37066                                          uint32_t imm = dt.GetSize() - imm6;
37067                                          // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37068                                          vqrshrun(CurrentCond(),
37069                                                   dt,
37070                                                   DRegister(rd),
37071                                                   QRegister(rm),
37072                                                   imm);
37073                                          break;
37074                                        }
37075                                      }
37076                                      break;
37077                                    }
37078                                    case 0x00000100: {
37079                                      // 0xef800950
37080                                      if (((instr & 0x380000) == 0x0)) {
37081                                        UnallocatedT32(instr);
37082                                        return;
37083                                      }
37084                                      DataType dt =
37085                                          Dt_imm6_1_Decode((instr >> 19) & 0x7,
37086                                                           (instr >> 28) & 0x1);
37087                                      if (dt.Is(kDataTypeValueInvalid)) {
37088                                        UnallocatedT32(instr);
37089                                        return;
37090                                      }
37091                                      unsigned rd =
37092                                          ExtractDRegister(instr, 22, 12);
37093                                      if ((instr & 1) != 0) {
37094                                        UnallocatedT32(instr);
37095                                        return;
37096                                      }
37097                                      unsigned rm =
37098                                          ExtractQRegister(instr, 5, 0);
37099                                      uint32_t imm6 = (instr >> 16) & 0x3f;
37100                                      uint32_t imm = dt.GetSize() - imm6;
37101                                      // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37102                                      vqrshrn(CurrentCond(),
37103                                              dt,
37104                                              DRegister(rd),
37105                                              QRegister(rm),
37106                                              imm);
37107                                      break;
37108                                    }
37109                                    default:
37110                                      UnallocatedT32(instr);
37111                                      break;
37112                                  }
37113                                  break;
37114                                }
37115                              }
37116                              break;
37117                            }
37118                            default:
37119                              UnallocatedT32(instr);
37120                              break;
37121                          }
37122                          break;
37123                        }
37124                        case 0x00000c00: {
37125                          // 0xef800c50
37126                          switch (instr & 0x00000080) {
37127                            case 0x00000000: {
37128                              // 0xef800c50
37129                              switch (instr & 0x00200000) {
37130                                case 0x00000000: {
37131                                  // 0xef800c50
37132                                  switch (instr & 0x00180000) {
37133                                    case 0x00000000: {
37134                                      // 0xef800c50
37135                                      switch (instr & 0x00000300) {
37136                                        case 0x00000200: {
37137                                          // 0xef800e50
37138                                          if (((instr & 0x920) == 0x100) ||
37139                                              ((instr & 0x520) == 0x100) ||
37140                                              ((instr & 0x820) == 0x20) ||
37141                                              ((instr & 0x420) == 0x20) ||
37142                                              ((instr & 0x220) == 0x20) ||
37143                                              ((instr & 0x120) == 0x120)) {
37144                                            UnallocatedT32(instr);
37145                                            return;
37146                                          }
37147                                          unsigned cmode =
37148                                              ((instr >> 8) & 0xf) |
37149                                              ((instr >> 1) & 0x10);
37150                                          DataType dt =
37151                                              ImmediateVmov::DecodeDt(cmode);
37152                                          if (dt.Is(kDataTypeValueInvalid)) {
37153                                            UnallocatedT32(instr);
37154                                            return;
37155                                          }
37156                                          if (((instr >> 12) & 1) != 0) {
37157                                            UnallocatedT32(instr);
37158                                            return;
37159                                          }
37160                                          unsigned rd =
37161                                              ExtractQRegister(instr, 22, 12);
37162                                          QOperand imm =
37163                                              ImmediateVmov::DecodeImmediate(
37164                                                  cmode,
37165                                                  (instr & 0xf) |
37166                                                      ((instr >> 12) & 0x70) |
37167                                                      ((instr >> 21) & 0x80));
37168                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37169                                          vmov(CurrentCond(),
37170                                               dt,
37171                                               QRegister(rd),
37172                                               imm);
37173                                          break;
37174                                        }
37175                                        case 0x00000300: {
37176                                          // 0xef800f50
37177                                          if (((instr & 0x920) == 0x100) ||
37178                                              ((instr & 0x520) == 0x100) ||
37179                                              ((instr & 0x820) == 0x20) ||
37180                                              ((instr & 0x420) == 0x20) ||
37181                                              ((instr & 0x220) == 0x20) ||
37182                                              ((instr & 0x120) == 0x120)) {
37183                                            UnallocatedT32(instr);
37184                                            return;
37185                                          }
37186                                          unsigned cmode =
37187                                              ((instr >> 8) & 0xf) |
37188                                              ((instr >> 1) & 0x10);
37189                                          DataType dt =
37190                                              ImmediateVmov::DecodeDt(cmode);
37191                                          if (dt.Is(kDataTypeValueInvalid)) {
37192                                            UnallocatedT32(instr);
37193                                            return;
37194                                          }
37195                                          if (((instr >> 12) & 1) != 0) {
37196                                            UnallocatedT32(instr);
37197                                            return;
37198                                          }
37199                                          unsigned rd =
37200                                              ExtractQRegister(instr, 22, 12);
37201                                          QOperand imm =
37202                                              ImmediateVmov::DecodeImmediate(
37203                                                  cmode,
37204                                                  (instr & 0xf) |
37205                                                      ((instr >> 12) & 0x70) |
37206                                                      ((instr >> 21) & 0x80));
37207                                          // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37208                                          vmov(CurrentCond(),
37209                                               dt,
37210                                               QRegister(rd),
37211                                               imm);
37212                                          break;
37213                                        }
37214                                        default: {
37215                                          switch (instr & 0x00000020) {
37216                                            case 0x00000020: {
37217                                              // 0xef800c70
37218                                              switch (instr & 0x00000f20) {
37219                                                case 0x00000000: {
37220                                                  // 0xef800c50
37221                                                  if (((instr & 0x920) ==
37222                                                       0x100) ||
37223                                                      ((instr & 0x520) ==
37224                                                       0x100) ||
37225                                                      ((instr & 0x820) ==
37226                                                       0x20) ||
37227                                                      ((instr & 0x420) ==
37228                                                       0x20) ||
37229                                                      ((instr & 0x220) ==
37230                                                       0x20) ||
37231                                                      ((instr & 0x120) ==
37232                                                       0x120)) {
37233                                                    UnallocatedT32(instr);
37234                                                    return;
37235                                                  }
37236                                                  unsigned cmode =
37237                                                      ((instr >> 8) & 0xf) |
37238                                                      ((instr >> 1) & 0x10);
37239                                                  DataType dt =
37240                                                      ImmediateVmov::DecodeDt(
37241                                                          cmode);
37242                                                  if (dt.Is(
37243                                                          kDataTypeValueInvalid)) {
37244                                                    UnallocatedT32(instr);
37245                                                    return;
37246                                                  }
37247                                                  if (((instr >> 12) & 1) !=
37248                                                      0) {
37249                                                    UnallocatedT32(instr);
37250                                                    return;
37251                                                  }
37252                                                  unsigned rd =
37253                                                      ExtractQRegister(instr,
37254                                                                       22,
37255                                                                       12);
37256                                                  QOperand imm = ImmediateVmov::
37257                                                      DecodeImmediate(
37258                                                          cmode,
37259                                                          (instr & 0xf) |
37260                                                              ((instr >> 12) &
37261                                                               0x70) |
37262                                                              ((instr >> 21) &
37263                                                               0x80));
37264                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37265                                                  vmov(CurrentCond(),
37266                                                       dt,
37267                                                       QRegister(rd),
37268                                                       imm);
37269                                                  break;
37270                                                }
37271                                                case 0x00000020: {
37272                                                  // 0xef800c70
37273                                                  if (((instr & 0xd00) ==
37274                                                       0x100) ||
37275                                                      ((instr & 0xd00) ==
37276                                                       0x500) ||
37277                                                      ((instr & 0xd00) ==
37278                                                       0x900) ||
37279                                                      ((instr & 0xe00) ==
37280                                                       0xe00)) {
37281                                                    UnallocatedT32(instr);
37282                                                    return;
37283                                                  }
37284                                                  unsigned cmode =
37285                                                      (instr >> 8) & 0xf;
37286                                                  DataType dt =
37287                                                      ImmediateVmvn::DecodeDt(
37288                                                          cmode);
37289                                                  if (dt.Is(
37290                                                          kDataTypeValueInvalid)) {
37291                                                    UnallocatedT32(instr);
37292                                                    return;
37293                                                  }
37294                                                  if (((instr >> 12) & 1) !=
37295                                                      0) {
37296                                                    UnallocatedT32(instr);
37297                                                    return;
37298                                                  }
37299                                                  unsigned rd =
37300                                                      ExtractQRegister(instr,
37301                                                                       22,
37302                                                                       12);
37303                                                  QOperand imm = ImmediateVmvn::
37304                                                      DecodeImmediate(
37305                                                          cmode,
37306                                                          (instr & 0xf) |
37307                                                              ((instr >> 12) &
37308                                                               0x70) |
37309                                                              ((instr >> 21) &
37310                                                               0x80));
37311                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37312                                                  vmvn(CurrentCond(),
37313                                                       dt,
37314                                                       QRegister(rd),
37315                                                       imm);
37316                                                  break;
37317                                                }
37318                                                case 0x00000200: {
37319                                                  // 0xef800e50
37320                                                  if (((instr & 0x920) ==
37321                                                       0x100) ||
37322                                                      ((instr & 0x520) ==
37323                                                       0x100) ||
37324                                                      ((instr & 0x820) ==
37325                                                       0x20) ||
37326                                                      ((instr & 0x420) ==
37327                                                       0x20) ||
37328                                                      ((instr & 0x220) ==
37329                                                       0x20) ||
37330                                                      ((instr & 0x120) ==
37331                                                       0x120)) {
37332                                                    UnallocatedT32(instr);
37333                                                    return;
37334                                                  }
37335                                                  unsigned cmode =
37336                                                      ((instr >> 8) & 0xf) |
37337                                                      ((instr >> 1) & 0x10);
37338                                                  DataType dt =
37339                                                      ImmediateVmov::DecodeDt(
37340                                                          cmode);
37341                                                  if (dt.Is(
37342                                                          kDataTypeValueInvalid)) {
37343                                                    UnallocatedT32(instr);
37344                                                    return;
37345                                                  }
37346                                                  if (((instr >> 12) & 1) !=
37347                                                      0) {
37348                                                    UnallocatedT32(instr);
37349                                                    return;
37350                                                  }
37351                                                  unsigned rd =
37352                                                      ExtractQRegister(instr,
37353                                                                       22,
37354                                                                       12);
37355                                                  QOperand imm = ImmediateVmov::
37356                                                      DecodeImmediate(
37357                                                          cmode,
37358                                                          (instr & 0xf) |
37359                                                              ((instr >> 12) &
37360                                                               0x70) |
37361                                                              ((instr >> 21) &
37362                                                               0x80));
37363                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37364                                                  vmov(CurrentCond(),
37365                                                       dt,
37366                                                       QRegister(rd),
37367                                                       imm);
37368                                                  break;
37369                                                }
37370                                                case 0x00000220: {
37371                                                  // 0xef800e70
37372                                                  if (((instr & 0xd00) ==
37373                                                       0x100) ||
37374                                                      ((instr & 0xd00) ==
37375                                                       0x500) ||
37376                                                      ((instr & 0xd00) ==
37377                                                       0x900) ||
37378                                                      ((instr & 0xe00) ==
37379                                                       0xe00)) {
37380                                                    UnallocatedT32(instr);
37381                                                    return;
37382                                                  }
37383                                                  unsigned cmode =
37384                                                      (instr >> 8) & 0xf;
37385                                                  DataType dt =
37386                                                      ImmediateVmvn::DecodeDt(
37387                                                          cmode);
37388                                                  if (dt.Is(
37389                                                          kDataTypeValueInvalid)) {
37390                                                    UnallocatedT32(instr);
37391                                                    return;
37392                                                  }
37393                                                  if (((instr >> 12) & 1) !=
37394                                                      0) {
37395                                                    UnallocatedT32(instr);
37396                                                    return;
37397                                                  }
37398                                                  unsigned rd =
37399                                                      ExtractQRegister(instr,
37400                                                                       22,
37401                                                                       12);
37402                                                  QOperand imm = ImmediateVmvn::
37403                                                      DecodeImmediate(
37404                                                          cmode,
37405                                                          (instr & 0xf) |
37406                                                              ((instr >> 12) &
37407                                                               0x70) |
37408                                                              ((instr >> 21) &
37409                                                               0x80));
37410                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37411                                                  vmvn(CurrentCond(),
37412                                                       dt,
37413                                                       QRegister(rd),
37414                                                       imm);
37415                                                  break;
37416                                                }
37417                                                case 0x00000400: {
37418                                                  // 0xef800c50
37419                                                  if (((instr & 0x920) ==
37420                                                       0x100) ||
37421                                                      ((instr & 0x520) ==
37422                                                       0x100) ||
37423                                                      ((instr & 0x820) ==
37424                                                       0x20) ||
37425                                                      ((instr & 0x420) ==
37426                                                       0x20) ||
37427                                                      ((instr & 0x220) ==
37428                                                       0x20) ||
37429                                                      ((instr & 0x120) ==
37430                                                       0x120)) {
37431                                                    UnallocatedT32(instr);
37432                                                    return;
37433                                                  }
37434                                                  unsigned cmode =
37435                                                      ((instr >> 8) & 0xf) |
37436                                                      ((instr >> 1) & 0x10);
37437                                                  DataType dt =
37438                                                      ImmediateVmov::DecodeDt(
37439                                                          cmode);
37440                                                  if (dt.Is(
37441                                                          kDataTypeValueInvalid)) {
37442                                                    UnallocatedT32(instr);
37443                                                    return;
37444                                                  }
37445                                                  if (((instr >> 12) & 1) !=
37446                                                      0) {
37447                                                    UnallocatedT32(instr);
37448                                                    return;
37449                                                  }
37450                                                  unsigned rd =
37451                                                      ExtractQRegister(instr,
37452                                                                       22,
37453                                                                       12);
37454                                                  QOperand imm = ImmediateVmov::
37455                                                      DecodeImmediate(
37456                                                          cmode,
37457                                                          (instr & 0xf) |
37458                                                              ((instr >> 12) &
37459                                                               0x70) |
37460                                                              ((instr >> 21) &
37461                                                               0x80));
37462                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37463                                                  vmov(CurrentCond(),
37464                                                       dt,
37465                                                       QRegister(rd),
37466                                                       imm);
37467                                                  break;
37468                                                }
37469                                                case 0x00000420: {
37470                                                  // 0xef800c70
37471                                                  if (((instr & 0xd00) ==
37472                                                       0x100) ||
37473                                                      ((instr & 0xd00) ==
37474                                                       0x500) ||
37475                                                      ((instr & 0xd00) ==
37476                                                       0x900) ||
37477                                                      ((instr & 0xe00) ==
37478                                                       0xe00)) {
37479                                                    UnallocatedT32(instr);
37480                                                    return;
37481                                                  }
37482                                                  unsigned cmode =
37483                                                      (instr >> 8) & 0xf;
37484                                                  DataType dt =
37485                                                      ImmediateVmvn::DecodeDt(
37486                                                          cmode);
37487                                                  if (dt.Is(
37488                                                          kDataTypeValueInvalid)) {
37489                                                    UnallocatedT32(instr);
37490                                                    return;
37491                                                  }
37492                                                  if (((instr >> 12) & 1) !=
37493                                                      0) {
37494                                                    UnallocatedT32(instr);
37495                                                    return;
37496                                                  }
37497                                                  unsigned rd =
37498                                                      ExtractQRegister(instr,
37499                                                                       22,
37500                                                                       12);
37501                                                  QOperand imm = ImmediateVmvn::
37502                                                      DecodeImmediate(
37503                                                          cmode,
37504                                                          (instr & 0xf) |
37505                                                              ((instr >> 12) &
37506                                                               0x70) |
37507                                                              ((instr >> 21) &
37508                                                               0x80));
37509                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37510                                                  vmvn(CurrentCond(),
37511                                                       dt,
37512                                                       QRegister(rd),
37513                                                       imm);
37514                                                  break;
37515                                                }
37516                                                case 0x00000600: {
37517                                                  // 0xef800e50
37518                                                  if (((instr & 0x920) ==
37519                                                       0x100) ||
37520                                                      ((instr & 0x520) ==
37521                                                       0x100) ||
37522                                                      ((instr & 0x820) ==
37523                                                       0x20) ||
37524                                                      ((instr & 0x420) ==
37525                                                       0x20) ||
37526                                                      ((instr & 0x220) ==
37527                                                       0x20) ||
37528                                                      ((instr & 0x120) ==
37529                                                       0x120)) {
37530                                                    UnallocatedT32(instr);
37531                                                    return;
37532                                                  }
37533                                                  unsigned cmode =
37534                                                      ((instr >> 8) & 0xf) |
37535                                                      ((instr >> 1) & 0x10);
37536                                                  DataType dt =
37537                                                      ImmediateVmov::DecodeDt(
37538                                                          cmode);
37539                                                  if (dt.Is(
37540                                                          kDataTypeValueInvalid)) {
37541                                                    UnallocatedT32(instr);
37542                                                    return;
37543                                                  }
37544                                                  if (((instr >> 12) & 1) !=
37545                                                      0) {
37546                                                    UnallocatedT32(instr);
37547                                                    return;
37548                                                  }
37549                                                  unsigned rd =
37550                                                      ExtractQRegister(instr,
37551                                                                       22,
37552                                                                       12);
37553                                                  QOperand imm = ImmediateVmov::
37554                                                      DecodeImmediate(
37555                                                          cmode,
37556                                                          (instr & 0xf) |
37557                                                              ((instr >> 12) &
37558                                                               0x70) |
37559                                                              ((instr >> 21) &
37560                                                               0x80));
37561                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37562                                                  vmov(CurrentCond(),
37563                                                       dt,
37564                                                       QRegister(rd),
37565                                                       imm);
37566                                                  break;
37567                                                }
37568                                                case 0x00000620: {
37569                                                  // 0xef800e70
37570                                                  if (((instr & 0xd00) ==
37571                                                       0x100) ||
37572                                                      ((instr & 0xd00) ==
37573                                                       0x500) ||
37574                                                      ((instr & 0xd00) ==
37575                                                       0x900) ||
37576                                                      ((instr & 0xe00) ==
37577                                                       0xe00)) {
37578                                                    UnallocatedT32(instr);
37579                                                    return;
37580                                                  }
37581                                                  unsigned cmode =
37582                                                      (instr >> 8) & 0xf;
37583                                                  DataType dt =
37584                                                      ImmediateVmvn::DecodeDt(
37585                                                          cmode);
37586                                                  if (dt.Is(
37587                                                          kDataTypeValueInvalid)) {
37588                                                    UnallocatedT32(instr);
37589                                                    return;
37590                                                  }
37591                                                  if (((instr >> 12) & 1) !=
37592                                                      0) {
37593                                                    UnallocatedT32(instr);
37594                                                    return;
37595                                                  }
37596                                                  unsigned rd =
37597                                                      ExtractQRegister(instr,
37598                                                                       22,
37599                                                                       12);
37600                                                  QOperand imm = ImmediateVmvn::
37601                                                      DecodeImmediate(
37602                                                          cmode,
37603                                                          (instr & 0xf) |
37604                                                              ((instr >> 12) &
37605                                                               0x70) |
37606                                                              ((instr >> 21) &
37607                                                               0x80));
37608                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37609                                                  vmvn(CurrentCond(),
37610                                                       dt,
37611                                                       QRegister(rd),
37612                                                       imm);
37613                                                  break;
37614                                                }
37615                                                case 0x00000800: {
37616                                                  // 0xef800c50
37617                                                  if (((instr & 0x920) ==
37618                                                       0x100) ||
37619                                                      ((instr & 0x520) ==
37620                                                       0x100) ||
37621                                                      ((instr & 0x820) ==
37622                                                       0x20) ||
37623                                                      ((instr & 0x420) ==
37624                                                       0x20) ||
37625                                                      ((instr & 0x220) ==
37626                                                       0x20) ||
37627                                                      ((instr & 0x120) ==
37628                                                       0x120)) {
37629                                                    UnallocatedT32(instr);
37630                                                    return;
37631                                                  }
37632                                                  unsigned cmode =
37633                                                      ((instr >> 8) & 0xf) |
37634                                                      ((instr >> 1) & 0x10);
37635                                                  DataType dt =
37636                                                      ImmediateVmov::DecodeDt(
37637                                                          cmode);
37638                                                  if (dt.Is(
37639                                                          kDataTypeValueInvalid)) {
37640                                                    UnallocatedT32(instr);
37641                                                    return;
37642                                                  }
37643                                                  if (((instr >> 12) & 1) !=
37644                                                      0) {
37645                                                    UnallocatedT32(instr);
37646                                                    return;
37647                                                  }
37648                                                  unsigned rd =
37649                                                      ExtractQRegister(instr,
37650                                                                       22,
37651                                                                       12);
37652                                                  QOperand imm = ImmediateVmov::
37653                                                      DecodeImmediate(
37654                                                          cmode,
37655                                                          (instr & 0xf) |
37656                                                              ((instr >> 12) &
37657                                                               0x70) |
37658                                                              ((instr >> 21) &
37659                                                               0x80));
37660                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37661                                                  vmov(CurrentCond(),
37662                                                       dt,
37663                                                       QRegister(rd),
37664                                                       imm);
37665                                                  break;
37666                                                }
37667                                                case 0x00000820: {
37668                                                  // 0xef800c70
37669                                                  if (((instr & 0xd00) ==
37670                                                       0x100) ||
37671                                                      ((instr & 0xd00) ==
37672                                                       0x500) ||
37673                                                      ((instr & 0xd00) ==
37674                                                       0x900) ||
37675                                                      ((instr & 0xe00) ==
37676                                                       0xe00)) {
37677                                                    UnallocatedT32(instr);
37678                                                    return;
37679                                                  }
37680                                                  unsigned cmode =
37681                                                      (instr >> 8) & 0xf;
37682                                                  DataType dt =
37683                                                      ImmediateVmvn::DecodeDt(
37684                                                          cmode);
37685                                                  if (dt.Is(
37686                                                          kDataTypeValueInvalid)) {
37687                                                    UnallocatedT32(instr);
37688                                                    return;
37689                                                  }
37690                                                  if (((instr >> 12) & 1) !=
37691                                                      0) {
37692                                                    UnallocatedT32(instr);
37693                                                    return;
37694                                                  }
37695                                                  unsigned rd =
37696                                                      ExtractQRegister(instr,
37697                                                                       22,
37698                                                                       12);
37699                                                  QOperand imm = ImmediateVmvn::
37700                                                      DecodeImmediate(
37701                                                          cmode,
37702                                                          (instr & 0xf) |
37703                                                              ((instr >> 12) &
37704                                                               0x70) |
37705                                                              ((instr >> 21) &
37706                                                               0x80));
37707                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37708                                                  vmvn(CurrentCond(),
37709                                                       dt,
37710                                                       QRegister(rd),
37711                                                       imm);
37712                                                  break;
37713                                                }
37714                                                case 0x00000a00: {
37715                                                  // 0xef800e50
37716                                                  if (((instr & 0x920) ==
37717                                                       0x100) ||
37718                                                      ((instr & 0x520) ==
37719                                                       0x100) ||
37720                                                      ((instr & 0x820) ==
37721                                                       0x20) ||
37722                                                      ((instr & 0x420) ==
37723                                                       0x20) ||
37724                                                      ((instr & 0x220) ==
37725                                                       0x20) ||
37726                                                      ((instr & 0x120) ==
37727                                                       0x120)) {
37728                                                    UnallocatedT32(instr);
37729                                                    return;
37730                                                  }
37731                                                  unsigned cmode =
37732                                                      ((instr >> 8) & 0xf) |
37733                                                      ((instr >> 1) & 0x10);
37734                                                  DataType dt =
37735                                                      ImmediateVmov::DecodeDt(
37736                                                          cmode);
37737                                                  if (dt.Is(
37738                                                          kDataTypeValueInvalid)) {
37739                                                    UnallocatedT32(instr);
37740                                                    return;
37741                                                  }
37742                                                  if (((instr >> 12) & 1) !=
37743                                                      0) {
37744                                                    UnallocatedT32(instr);
37745                                                    return;
37746                                                  }
37747                                                  unsigned rd =
37748                                                      ExtractQRegister(instr,
37749                                                                       22,
37750                                                                       12);
37751                                                  QOperand imm = ImmediateVmov::
37752                                                      DecodeImmediate(
37753                                                          cmode,
37754                                                          (instr & 0xf) |
37755                                                              ((instr >> 12) &
37756                                                               0x70) |
37757                                                              ((instr >> 21) &
37758                                                               0x80));
37759                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37760                                                  vmov(CurrentCond(),
37761                                                       dt,
37762                                                       QRegister(rd),
37763                                                       imm);
37764                                                  break;
37765                                                }
37766                                                case 0x00000a20: {
37767                                                  // 0xef800e70
37768                                                  if (((instr & 0xd00) ==
37769                                                       0x100) ||
37770                                                      ((instr & 0xd00) ==
37771                                                       0x500) ||
37772                                                      ((instr & 0xd00) ==
37773                                                       0x900) ||
37774                                                      ((instr & 0xe00) ==
37775                                                       0xe00)) {
37776                                                    UnallocatedT32(instr);
37777                                                    return;
37778                                                  }
37779                                                  unsigned cmode =
37780                                                      (instr >> 8) & 0xf;
37781                                                  DataType dt =
37782                                                      ImmediateVmvn::DecodeDt(
37783                                                          cmode);
37784                                                  if (dt.Is(
37785                                                          kDataTypeValueInvalid)) {
37786                                                    UnallocatedT32(instr);
37787                                                    return;
37788                                                  }
37789                                                  if (((instr >> 12) & 1) !=
37790                                                      0) {
37791                                                    UnallocatedT32(instr);
37792                                                    return;
37793                                                  }
37794                                                  unsigned rd =
37795                                                      ExtractQRegister(instr,
37796                                                                       22,
37797                                                                       12);
37798                                                  QOperand imm = ImmediateVmvn::
37799                                                      DecodeImmediate(
37800                                                          cmode,
37801                                                          (instr & 0xf) |
37802                                                              ((instr >> 12) &
37803                                                               0x70) |
37804                                                              ((instr >> 21) &
37805                                                               0x80));
37806                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37807                                                  vmvn(CurrentCond(),
37808                                                       dt,
37809                                                       QRegister(rd),
37810                                                       imm);
37811                                                  break;
37812                                                }
37813                                                case 0x00000c00: {
37814                                                  // 0xef800c50
37815                                                  if (((instr & 0x920) ==
37816                                                       0x100) ||
37817                                                      ((instr & 0x520) ==
37818                                                       0x100) ||
37819                                                      ((instr & 0x820) ==
37820                                                       0x20) ||
37821                                                      ((instr & 0x420) ==
37822                                                       0x20) ||
37823                                                      ((instr & 0x220) ==
37824                                                       0x20) ||
37825                                                      ((instr & 0x120) ==
37826                                                       0x120)) {
37827                                                    UnallocatedT32(instr);
37828                                                    return;
37829                                                  }
37830                                                  unsigned cmode =
37831                                                      ((instr >> 8) & 0xf) |
37832                                                      ((instr >> 1) & 0x10);
37833                                                  DataType dt =
37834                                                      ImmediateVmov::DecodeDt(
37835                                                          cmode);
37836                                                  if (dt.Is(
37837                                                          kDataTypeValueInvalid)) {
37838                                                    UnallocatedT32(instr);
37839                                                    return;
37840                                                  }
37841                                                  if (((instr >> 12) & 1) !=
37842                                                      0) {
37843                                                    UnallocatedT32(instr);
37844                                                    return;
37845                                                  }
37846                                                  unsigned rd =
37847                                                      ExtractQRegister(instr,
37848                                                                       22,
37849                                                                       12);
37850                                                  QOperand imm = ImmediateVmov::
37851                                                      DecodeImmediate(
37852                                                          cmode,
37853                                                          (instr & 0xf) |
37854                                                              ((instr >> 12) &
37855                                                               0x70) |
37856                                                              ((instr >> 21) &
37857                                                               0x80));
37858                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37859                                                  vmov(CurrentCond(),
37860                                                       dt,
37861                                                       QRegister(rd),
37862                                                       imm);
37863                                                  break;
37864                                                }
37865                                                case 0x00000c20: {
37866                                                  // 0xef800c70
37867                                                  if (((instr & 0xd00) ==
37868                                                       0x100) ||
37869                                                      ((instr & 0xd00) ==
37870                                                       0x500) ||
37871                                                      ((instr & 0xd00) ==
37872                                                       0x900) ||
37873                                                      ((instr & 0xe00) ==
37874                                                       0xe00)) {
37875                                                    UnallocatedT32(instr);
37876                                                    return;
37877                                                  }
37878                                                  unsigned cmode =
37879                                                      (instr >> 8) & 0xf;
37880                                                  DataType dt =
37881                                                      ImmediateVmvn::DecodeDt(
37882                                                          cmode);
37883                                                  if (dt.Is(
37884                                                          kDataTypeValueInvalid)) {
37885                                                    UnallocatedT32(instr);
37886                                                    return;
37887                                                  }
37888                                                  if (((instr >> 12) & 1) !=
37889                                                      0) {
37890                                                    UnallocatedT32(instr);
37891                                                    return;
37892                                                  }
37893                                                  unsigned rd =
37894                                                      ExtractQRegister(instr,
37895                                                                       22,
37896                                                                       12);
37897                                                  QOperand imm = ImmediateVmvn::
37898                                                      DecodeImmediate(
37899                                                          cmode,
37900                                                          (instr & 0xf) |
37901                                                              ((instr >> 12) &
37902                                                               0x70) |
37903                                                              ((instr >> 21) &
37904                                                               0x80));
37905                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37906                                                  vmvn(CurrentCond(),
37907                                                       dt,
37908                                                       QRegister(rd),
37909                                                       imm);
37910                                                  break;
37911                                                }
37912                                                case 0x00000d00: {
37913                                                  // 0xef800d50
37914                                                  if (((instr & 0x920) ==
37915                                                       0x100) ||
37916                                                      ((instr & 0x520) ==
37917                                                       0x100) ||
37918                                                      ((instr & 0x820) ==
37919                                                       0x20) ||
37920                                                      ((instr & 0x420) ==
37921                                                       0x20) ||
37922                                                      ((instr & 0x220) ==
37923                                                       0x20) ||
37924                                                      ((instr & 0x120) ==
37925                                                       0x120)) {
37926                                                    UnallocatedT32(instr);
37927                                                    return;
37928                                                  }
37929                                                  unsigned cmode =
37930                                                      ((instr >> 8) & 0xf) |
37931                                                      ((instr >> 1) & 0x10);
37932                                                  DataType dt =
37933                                                      ImmediateVmov::DecodeDt(
37934                                                          cmode);
37935                                                  if (dt.Is(
37936                                                          kDataTypeValueInvalid)) {
37937                                                    UnallocatedT32(instr);
37938                                                    return;
37939                                                  }
37940                                                  if (((instr >> 12) & 1) !=
37941                                                      0) {
37942                                                    UnallocatedT32(instr);
37943                                                    return;
37944                                                  }
37945                                                  unsigned rd =
37946                                                      ExtractQRegister(instr,
37947                                                                       22,
37948                                                                       12);
37949                                                  QOperand imm = ImmediateVmov::
37950                                                      DecodeImmediate(
37951                                                          cmode,
37952                                                          (instr & 0xf) |
37953                                                              ((instr >> 12) &
37954                                                               0x70) |
37955                                                              ((instr >> 21) &
37956                                                               0x80));
37957                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37958                                                  vmov(CurrentCond(),
37959                                                       dt,
37960                                                       QRegister(rd),
37961                                                       imm);
37962                                                  break;
37963                                                }
37964                                                case 0x00000d20: {
37965                                                  // 0xef800d70
37966                                                  if (((instr & 0xd00) ==
37967                                                       0x100) ||
37968                                                      ((instr & 0xd00) ==
37969                                                       0x500) ||
37970                                                      ((instr & 0xd00) ==
37971                                                       0x900) ||
37972                                                      ((instr & 0xe00) ==
37973                                                       0xe00)) {
37974                                                    UnallocatedT32(instr);
37975                                                    return;
37976                                                  }
37977                                                  unsigned cmode =
37978                                                      (instr >> 8) & 0xf;
37979                                                  DataType dt =
37980                                                      ImmediateVmvn::DecodeDt(
37981                                                          cmode);
37982                                                  if (dt.Is(
37983                                                          kDataTypeValueInvalid)) {
37984                                                    UnallocatedT32(instr);
37985                                                    return;
37986                                                  }
37987                                                  if (((instr >> 12) & 1) !=
37988                                                      0) {
37989                                                    UnallocatedT32(instr);
37990                                                    return;
37991                                                  }
37992                                                  unsigned rd =
37993                                                      ExtractQRegister(instr,
37994                                                                       22,
37995                                                                       12);
37996                                                  QOperand imm = ImmediateVmvn::
37997                                                      DecodeImmediate(
37998                                                          cmode,
37999                                                          (instr & 0xf) |
38000                                                              ((instr >> 12) &
38001                                                               0x70) |
38002                                                              ((instr >> 21) &
38003                                                               0x80));
38004                                                  // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38005                                                  vmvn(CurrentCond(),
38006                                                       dt,
38007                                                       QRegister(rd),
38008                                                       imm);
38009                                                  break;
38010                                                }
38011                                                case 0x00000e00: {
38012                                                  // 0xef800e50
38013                                                  if (((instr & 0x920) ==
38014                                                       0x100) ||
38015                                                      ((instr & 0x520) ==
38016                                                       0x100) ||
38017                                                      ((instr & 0x820) ==
38018                                                       0x20) ||
38019                                                      ((instr & 0x420) ==
38020                                                       0x20) ||
38021                                                      ((instr & 0x220) ==
38022                                                       0x20) ||
38023                                                      ((instr & 0x120) ==
38024                                                       0x120)) {
38025                                                    UnallocatedT32(instr);
38026                                                    return;
38027                                                  }
38028                                                  unsigned cmode =
38029                                                      ((instr >> 8) & 0xf) |
38030                                                      ((instr >> 1) & 0x10);
38031                                                  DataType dt =
38032                                                      ImmediateVmov::DecodeDt(
38033                                                          cmode);
38034                                                  if (dt.Is(
38035                                                          kDataTypeValueInvalid)) {
38036                                                    UnallocatedT32(instr);
38037                                                    return;
38038                                                  }
38039                                                  if (((instr >> 12) & 1) !=
38040                                                      0) {
38041                                                    UnallocatedT32(instr);
38042                                                    return;
38043                                                  }
38044                                                  unsigned rd =
38045                                                      ExtractQRegister(instr,
38046                                                                       22,
38047                                                                       12);
38048                                                  QOperand imm = ImmediateVmov::
38049                                                      DecodeImmediate(
38050                                                          cmode,
38051                                                          (instr & 0xf) |
38052                                                              ((instr >> 12) &
38053                                                               0x70) |
38054                                                              ((instr >> 21) &
38055                                                               0x80));
38056                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38057                                                  vmov(CurrentCond(),
38058                                                       dt,
38059                                                       QRegister(rd),
38060                                                       imm);
38061                                                  break;
38062                                                }
38063                                                case 0x00000e20: {
38064                                                  // 0xef800e70
38065                                                  if (((instr & 0x920) ==
38066                                                       0x100) ||
38067                                                      ((instr & 0x520) ==
38068                                                       0x100) ||
38069                                                      ((instr & 0x820) ==
38070                                                       0x20) ||
38071                                                      ((instr & 0x420) ==
38072                                                       0x20) ||
38073                                                      ((instr & 0x220) ==
38074                                                       0x20) ||
38075                                                      ((instr & 0x120) ==
38076                                                       0x120)) {
38077                                                    UnallocatedT32(instr);
38078                                                    return;
38079                                                  }
38080                                                  unsigned cmode =
38081                                                      ((instr >> 8) & 0xf) |
38082                                                      ((instr >> 1) & 0x10);
38083                                                  DataType dt =
38084                                                      ImmediateVmov::DecodeDt(
38085                                                          cmode);
38086                                                  if (dt.Is(
38087                                                          kDataTypeValueInvalid)) {
38088                                                    UnallocatedT32(instr);
38089                                                    return;
38090                                                  }
38091                                                  if (((instr >> 12) & 1) !=
38092                                                      0) {
38093                                                    UnallocatedT32(instr);
38094                                                    return;
38095                                                  }
38096                                                  unsigned rd =
38097                                                      ExtractQRegister(instr,
38098                                                                       22,
38099                                                                       12);
38100                                                  QOperand imm = ImmediateVmov::
38101                                                      DecodeImmediate(
38102                                                          cmode,
38103                                                          (instr & 0xf) |
38104                                                              ((instr >> 12) &
38105                                                               0x70) |
38106                                                              ((instr >> 21) &
38107                                                               0x80));
38108                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38109                                                  vmov(CurrentCond(),
38110                                                       dt,
38111                                                       QRegister(rd),
38112                                                       imm);
38113                                                  break;
38114                                                }
38115                                                case 0x00000f00: {
38116                                                  // 0xef800f50
38117                                                  if (((instr & 0x920) ==
38118                                                       0x100) ||
38119                                                      ((instr & 0x520) ==
38120                                                       0x100) ||
38121                                                      ((instr & 0x820) ==
38122                                                       0x20) ||
38123                                                      ((instr & 0x420) ==
38124                                                       0x20) ||
38125                                                      ((instr & 0x220) ==
38126                                                       0x20) ||
38127                                                      ((instr & 0x120) ==
38128                                                       0x120)) {
38129                                                    UnallocatedT32(instr);
38130                                                    return;
38131                                                  }
38132                                                  unsigned cmode =
38133                                                      ((instr >> 8) & 0xf) |
38134                                                      ((instr >> 1) & 0x10);
38135                                                  DataType dt =
38136                                                      ImmediateVmov::DecodeDt(
38137                                                          cmode);
38138                                                  if (dt.Is(
38139                                                          kDataTypeValueInvalid)) {
38140                                                    UnallocatedT32(instr);
38141                                                    return;
38142                                                  }
38143                                                  if (((instr >> 12) & 1) !=
38144                                                      0) {
38145                                                    UnallocatedT32(instr);
38146                                                    return;
38147                                                  }
38148                                                  unsigned rd =
38149                                                      ExtractQRegister(instr,
38150                                                                       22,
38151                                                                       12);
38152                                                  QOperand imm = ImmediateVmov::
38153                                                      DecodeImmediate(
38154                                                          cmode,
38155                                                          (instr & 0xf) |
38156                                                              ((instr >> 12) &
38157                                                               0x70) |
38158                                                              ((instr >> 21) &
38159                                                               0x80));
38160                                                  // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38161                                                  vmov(CurrentCond(),
38162                                                       dt,
38163                                                       QRegister(rd),
38164                                                       imm);
38165                                                  break;
38166                                                }
38167                                                default:
38168                                                  UnallocatedT32(instr);
38169                                                  break;
38170                                              }
38171                                              break;
38172                                            }
38173                                            default: {
38174                                              if (((instr & 0x920) == 0x100) ||
38175                                                  ((instr & 0x520) == 0x100) ||
38176                                                  ((instr & 0x820) == 0x20) ||
38177                                                  ((instr & 0x420) == 0x20) ||
38178                                                  ((instr & 0x220) == 0x20) ||
38179                                                  ((instr & 0x120) == 0x120)) {
38180                                                UnallocatedT32(instr);
38181                                                return;
38182                                              }
38183                                              unsigned cmode =
38184                                                  ((instr >> 8) & 0xf) |
38185                                                  ((instr >> 1) & 0x10);
38186                                              DataType dt =
38187                                                  ImmediateVmov::DecodeDt(
38188                                                      cmode);
38189                                              if (dt.Is(
38190                                                      kDataTypeValueInvalid)) {
38191                                                UnallocatedT32(instr);
38192                                                return;
38193                                              }
38194                                              if (((instr >> 12) & 1) != 0) {
38195                                                UnallocatedT32(instr);
38196                                                return;
38197                                              }
38198                                              unsigned rd =
38199                                                  ExtractQRegister(instr,
38200                                                                   22,
38201                                                                   12);
38202                                              QOperand imm = ImmediateVmov::
38203                                                  DecodeImmediate(cmode,
38204                                                                  (instr &
38205                                                                   0xf) |
38206                                                                      ((instr >>
38207                                                                        12) &
38208                                                                       0x70) |
38209                                                                      ((instr >>
38210                                                                        21) &
38211                                                                       0x80));
38212                                              // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38213                                              vmov(CurrentCond(),
38214                                                   dt,
38215                                                   QRegister(rd),
38216                                                   imm);
38217                                              break;
38218                                            }
38219                                          }
38220                                          break;
38221                                        }
38222                                      }
38223                                      break;
38224                                    }
38225                                    default:
38226                                      UnallocatedT32(instr);
38227                                      break;
38228                                  }
38229                                  break;
38230                                }
38231                                default: {
38232                                  if ((instr & 0x00000200) == 0x00000200) {
38233                                    if (((instr & 0x200000) == 0x0)) {
38234                                      UnallocatedT32(instr);
38235                                      return;
38236                                    }
38237                                    DataType dt1 = Dt_op_U_1_Decode1(
38238                                        ((instr >> 28) & 0x1) |
38239                                        ((instr >> 7) & 0x2));
38240                                    if (dt1.Is(kDataTypeValueInvalid)) {
38241                                      UnallocatedT32(instr);
38242                                      return;
38243                                    }
38244                                    DataType dt2 = Dt_op_U_1_Decode2(
38245                                        ((instr >> 28) & 0x1) |
38246                                        ((instr >> 7) & 0x2));
38247                                    if (dt2.Is(kDataTypeValueInvalid)) {
38248                                      UnallocatedT32(instr);
38249                                      return;
38250                                    }
38251                                    if (((instr >> 12) & 1) != 0) {
38252                                      UnallocatedT32(instr);
38253                                      return;
38254                                    }
38255                                    unsigned rd =
38256                                        ExtractQRegister(instr, 22, 12);
38257                                    if ((instr & 1) != 0) {
38258                                      UnallocatedT32(instr);
38259                                      return;
38260                                    }
38261                                    unsigned rm = ExtractQRegister(instr, 5, 0);
38262                                    uint32_t fbits =
38263                                        64 - ((instr >> 16) & 0x3f);
38264                                    // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
38265                                    vcvt(CurrentCond(),
38266                                         dt1,
38267                                         dt2,
38268                                         QRegister(rd),
38269                                         QRegister(rm),
38270                                         fbits);
38271                                  } else {
38272                                    UnallocatedT32(instr);
38273                                  }
38274                                  break;
38275                                }
38276                              }
38277                              break;
38278                            }
38279                            default:
38280                              UnallocatedT32(instr);
38281                              break;
38282                          }
38283                          break;
38284                        }
38285                      }
38286                      break;
38287                    }
38288                  }
38289                  break;
38290                }
38291              }
38292              break;
38293            }
38294          }
38295          break;
38296        }
38297      }
38298      break;
38299    }
38300  }
38301}  // NOLINT(readability/fn_size)
38302
38303void Disassembler::DecodeA32(uint32_t instr) {
38304  A32CodeAddressIncrementer incrementer(&code_address_);
38305  if ((instr & 0xf0000000) == 0xf0000000) {
38306    switch (instr & 0x0e000000) {
38307      case 0x00000000: {
38308        // 0xf0000000
38309        switch (instr & 0x01f10020) {
38310          case 0x01000000: {
38311            // 0xf1000000
38312            switch (instr & 0x000e0000) {
38313              case 0x00020000: {
38314                // 0xf1020000
38315                if ((instr & 0x000001c0) == 0x00000000) {
38316                  UnimplementedA32("CPS", instr);
38317                } else {
38318                  UnallocatedA32(instr);
38319                }
38320                break;
38321              }
38322              case 0x00080000: {
38323                // 0xf1080000
38324                if ((instr & 0x0000001f) == 0x00000000) {
38325                  UnimplementedA32("CPSIE", instr);
38326                } else {
38327                  UnallocatedA32(instr);
38328                }
38329                break;
38330              }
38331              case 0x000a0000: {
38332                // 0xf10a0000
38333                UnimplementedA32("CPSIE", instr);
38334                break;
38335              }
38336              case 0x000c0000: {
38337                // 0xf10c0000
38338                if ((instr & 0x0000001f) == 0x00000000) {
38339                  UnimplementedA32("CPSID", instr);
38340                } else {
38341                  UnallocatedA32(instr);
38342                }
38343                break;
38344              }
38345              case 0x000e0000: {
38346                // 0xf10e0000
38347                UnimplementedA32("CPSID", instr);
38348                break;
38349              }
38350              default:
38351                UnallocatedA32(instr);
38352                break;
38353            }
38354            break;
38355          }
38356          case 0x01010000: {
38357            // 0xf1010000
38358            if ((instr & 0x000000d0) == 0x00000000) {
38359              UnimplementedA32("SETEND", instr);
38360            } else {
38361              UnallocatedA32(instr);
38362            }
38363            break;
38364          }
38365          default:
38366            UnallocatedA32(instr);
38367            break;
38368        }
38369        break;
38370      }
38371      case 0x02000000: {
38372        // 0xf2000000
38373        switch (instr & 0x00800010) {
38374          case 0x00000000: {
38375            // 0xf2000000
38376            switch (instr & 0x00000f40) {
38377              case 0x00000000: {
38378                // 0xf2000000
38379                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38380                                                 ((instr >> 22) & 0x4));
38381                if (dt.Is(kDataTypeValueInvalid)) {
38382                  UnallocatedA32(instr);
38383                  return;
38384                }
38385                unsigned rd = ExtractDRegister(instr, 22, 12);
38386                unsigned rn = ExtractDRegister(instr, 7, 16);
38387                unsigned rm = ExtractDRegister(instr, 5, 0);
38388                // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38389                vhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38390                break;
38391              }
38392              case 0x00000040: {
38393                // 0xf2000040
38394                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38395                                                 ((instr >> 22) & 0x4));
38396                if (dt.Is(kDataTypeValueInvalid)) {
38397                  UnallocatedA32(instr);
38398                  return;
38399                }
38400                if (((instr >> 12) & 1) != 0) {
38401                  UnallocatedA32(instr);
38402                  return;
38403                }
38404                unsigned rd = ExtractQRegister(instr, 22, 12);
38405                if (((instr >> 16) & 1) != 0) {
38406                  UnallocatedA32(instr);
38407                  return;
38408                }
38409                unsigned rn = ExtractQRegister(instr, 7, 16);
38410                if ((instr & 1) != 0) {
38411                  UnallocatedA32(instr);
38412                  return;
38413                }
38414                unsigned rm = ExtractQRegister(instr, 5, 0);
38415                // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38416                vhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38417                break;
38418              }
38419              case 0x00000100: {
38420                // 0xf2000100
38421                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38422                                                 ((instr >> 22) & 0x4));
38423                if (dt.Is(kDataTypeValueInvalid)) {
38424                  UnallocatedA32(instr);
38425                  return;
38426                }
38427                unsigned rd = ExtractDRegister(instr, 22, 12);
38428                unsigned rn = ExtractDRegister(instr, 7, 16);
38429                unsigned rm = ExtractDRegister(instr, 5, 0);
38430                // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38431                vrhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38432                break;
38433              }
38434              case 0x00000140: {
38435                // 0xf2000140
38436                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38437                                                 ((instr >> 22) & 0x4));
38438                if (dt.Is(kDataTypeValueInvalid)) {
38439                  UnallocatedA32(instr);
38440                  return;
38441                }
38442                if (((instr >> 12) & 1) != 0) {
38443                  UnallocatedA32(instr);
38444                  return;
38445                }
38446                unsigned rd = ExtractQRegister(instr, 22, 12);
38447                if (((instr >> 16) & 1) != 0) {
38448                  UnallocatedA32(instr);
38449                  return;
38450                }
38451                unsigned rn = ExtractQRegister(instr, 7, 16);
38452                if ((instr & 1) != 0) {
38453                  UnallocatedA32(instr);
38454                  return;
38455                }
38456                unsigned rm = ExtractQRegister(instr, 5, 0);
38457                // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38458                vrhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38459                break;
38460              }
38461              case 0x00000200: {
38462                // 0xf2000200
38463                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38464                                                 ((instr >> 22) & 0x4));
38465                if (dt.Is(kDataTypeValueInvalid)) {
38466                  UnallocatedA32(instr);
38467                  return;
38468                }
38469                unsigned rd = ExtractDRegister(instr, 22, 12);
38470                unsigned rn = ExtractDRegister(instr, 7, 16);
38471                unsigned rm = ExtractDRegister(instr, 5, 0);
38472                // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38473                vhsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38474                break;
38475              }
38476              case 0x00000240: {
38477                // 0xf2000240
38478                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38479                                                 ((instr >> 22) & 0x4));
38480                if (dt.Is(kDataTypeValueInvalid)) {
38481                  UnallocatedA32(instr);
38482                  return;
38483                }
38484                if (((instr >> 12) & 1) != 0) {
38485                  UnallocatedA32(instr);
38486                  return;
38487                }
38488                unsigned rd = ExtractQRegister(instr, 22, 12);
38489                if (((instr >> 16) & 1) != 0) {
38490                  UnallocatedA32(instr);
38491                  return;
38492                }
38493                unsigned rn = ExtractQRegister(instr, 7, 16);
38494                if ((instr & 1) != 0) {
38495                  UnallocatedA32(instr);
38496                  return;
38497                }
38498                unsigned rm = ExtractQRegister(instr, 5, 0);
38499                // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38500                vhsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38501                break;
38502              }
38503              case 0x00000300: {
38504                // 0xf2000300
38505                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38506                                                 ((instr >> 22) & 0x4));
38507                if (dt.Is(kDataTypeValueInvalid)) {
38508                  UnallocatedA32(instr);
38509                  return;
38510                }
38511                unsigned rd = ExtractDRegister(instr, 22, 12);
38512                unsigned rn = ExtractDRegister(instr, 7, 16);
38513                unsigned rm = ExtractDRegister(instr, 5, 0);
38514                // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38515                vcgt(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38516                break;
38517              }
38518              case 0x00000340: {
38519                // 0xf2000340
38520                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38521                                                 ((instr >> 22) & 0x4));
38522                if (dt.Is(kDataTypeValueInvalid)) {
38523                  UnallocatedA32(instr);
38524                  return;
38525                }
38526                if (((instr >> 12) & 1) != 0) {
38527                  UnallocatedA32(instr);
38528                  return;
38529                }
38530                unsigned rd = ExtractQRegister(instr, 22, 12);
38531                if (((instr >> 16) & 1) != 0) {
38532                  UnallocatedA32(instr);
38533                  return;
38534                }
38535                unsigned rn = ExtractQRegister(instr, 7, 16);
38536                if ((instr & 1) != 0) {
38537                  UnallocatedA32(instr);
38538                  return;
38539                }
38540                unsigned rm = ExtractQRegister(instr, 5, 0);
38541                // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38542                vcgt(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38543                break;
38544              }
38545              case 0x00000400: {
38546                // 0xf2000400
38547                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38548                                                 ((instr >> 22) & 0x4));
38549                if (dt.Is(kDataTypeValueInvalid)) {
38550                  UnallocatedA32(instr);
38551                  return;
38552                }
38553                unsigned rd = ExtractDRegister(instr, 22, 12);
38554                unsigned rm = ExtractDRegister(instr, 5, 0);
38555                unsigned rn = ExtractDRegister(instr, 7, 16);
38556                // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
38557                vshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
38558                break;
38559              }
38560              case 0x00000440: {
38561                // 0xf2000440
38562                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38563                                                 ((instr >> 22) & 0x4));
38564                if (dt.Is(kDataTypeValueInvalid)) {
38565                  UnallocatedA32(instr);
38566                  return;
38567                }
38568                if (((instr >> 12) & 1) != 0) {
38569                  UnallocatedA32(instr);
38570                  return;
38571                }
38572                unsigned rd = ExtractQRegister(instr, 22, 12);
38573                if ((instr & 1) != 0) {
38574                  UnallocatedA32(instr);
38575                  return;
38576                }
38577                unsigned rm = ExtractQRegister(instr, 5, 0);
38578                if (((instr >> 16) & 1) != 0) {
38579                  UnallocatedA32(instr);
38580                  return;
38581                }
38582                unsigned rn = ExtractQRegister(instr, 7, 16);
38583                // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
38584                vshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
38585                break;
38586              }
38587              case 0x00000500: {
38588                // 0xf2000500
38589                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38590                                                 ((instr >> 22) & 0x4));
38591                if (dt.Is(kDataTypeValueInvalid)) {
38592                  UnallocatedA32(instr);
38593                  return;
38594                }
38595                unsigned rd = ExtractDRegister(instr, 22, 12);
38596                unsigned rm = ExtractDRegister(instr, 5, 0);
38597                unsigned rn = ExtractDRegister(instr, 7, 16);
38598                // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
38599                vrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
38600                break;
38601              }
38602              case 0x00000540: {
38603                // 0xf2000540
38604                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38605                                                 ((instr >> 22) & 0x4));
38606                if (dt.Is(kDataTypeValueInvalid)) {
38607                  UnallocatedA32(instr);
38608                  return;
38609                }
38610                if (((instr >> 12) & 1) != 0) {
38611                  UnallocatedA32(instr);
38612                  return;
38613                }
38614                unsigned rd = ExtractQRegister(instr, 22, 12);
38615                if ((instr & 1) != 0) {
38616                  UnallocatedA32(instr);
38617                  return;
38618                }
38619                unsigned rm = ExtractQRegister(instr, 5, 0);
38620                if (((instr >> 16) & 1) != 0) {
38621                  UnallocatedA32(instr);
38622                  return;
38623                }
38624                unsigned rn = ExtractQRegister(instr, 7, 16);
38625                // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
38626                vrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
38627                break;
38628              }
38629              case 0x00000600: {
38630                // 0xf2000600
38631                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38632                                                 ((instr >> 22) & 0x4));
38633                if (dt.Is(kDataTypeValueInvalid)) {
38634                  UnallocatedA32(instr);
38635                  return;
38636                }
38637                unsigned rd = ExtractDRegister(instr, 22, 12);
38638                unsigned rn = ExtractDRegister(instr, 7, 16);
38639                unsigned rm = ExtractDRegister(instr, 5, 0);
38640                // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38641                vmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38642                break;
38643              }
38644              case 0x00000640: {
38645                // 0xf2000640
38646                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38647                                                 ((instr >> 22) & 0x4));
38648                if (dt.Is(kDataTypeValueInvalid)) {
38649                  UnallocatedA32(instr);
38650                  return;
38651                }
38652                if (((instr >> 12) & 1) != 0) {
38653                  UnallocatedA32(instr);
38654                  return;
38655                }
38656                unsigned rd = ExtractQRegister(instr, 22, 12);
38657                if (((instr >> 16) & 1) != 0) {
38658                  UnallocatedA32(instr);
38659                  return;
38660                }
38661                unsigned rn = ExtractQRegister(instr, 7, 16);
38662                if ((instr & 1) != 0) {
38663                  UnallocatedA32(instr);
38664                  return;
38665                }
38666                unsigned rm = ExtractQRegister(instr, 5, 0);
38667                // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38668                vmax(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38669                break;
38670              }
38671              case 0x00000700: {
38672                // 0xf2000700
38673                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38674                                                 ((instr >> 22) & 0x4));
38675                if (dt.Is(kDataTypeValueInvalid)) {
38676                  UnallocatedA32(instr);
38677                  return;
38678                }
38679                unsigned rd = ExtractDRegister(instr, 22, 12);
38680                unsigned rn = ExtractDRegister(instr, 7, 16);
38681                unsigned rm = ExtractDRegister(instr, 5, 0);
38682                // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38683                vabd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38684                break;
38685              }
38686              case 0x00000740: {
38687                // 0xf2000740
38688                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38689                                                 ((instr >> 22) & 0x4));
38690                if (dt.Is(kDataTypeValueInvalid)) {
38691                  UnallocatedA32(instr);
38692                  return;
38693                }
38694                if (((instr >> 12) & 1) != 0) {
38695                  UnallocatedA32(instr);
38696                  return;
38697                }
38698                unsigned rd = ExtractQRegister(instr, 22, 12);
38699                if (((instr >> 16) & 1) != 0) {
38700                  UnallocatedA32(instr);
38701                  return;
38702                }
38703                unsigned rn = ExtractQRegister(instr, 7, 16);
38704                if ((instr & 1) != 0) {
38705                  UnallocatedA32(instr);
38706                  return;
38707                }
38708                unsigned rm = ExtractQRegister(instr, 5, 0);
38709                // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38710                vabd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38711                break;
38712              }
38713              case 0x00000800: {
38714                // 0xf2000800
38715                switch (instr & 0x01000000) {
38716                  case 0x00000000: {
38717                    // 0xf2000800
38718                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
38719                    if (dt.Is(kDataTypeValueInvalid)) {
38720                      UnallocatedA32(instr);
38721                      return;
38722                    }
38723                    unsigned rd = ExtractDRegister(instr, 22, 12);
38724                    unsigned rn = ExtractDRegister(instr, 7, 16);
38725                    unsigned rm = ExtractDRegister(instr, 5, 0);
38726                    // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38727                    vadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38728                    break;
38729                  }
38730                  case 0x01000000: {
38731                    // 0xf3000800
38732                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
38733                    if (dt.Is(kDataTypeValueInvalid)) {
38734                      UnallocatedA32(instr);
38735                      return;
38736                    }
38737                    unsigned rd = ExtractDRegister(instr, 22, 12);
38738                    unsigned rn = ExtractDRegister(instr, 7, 16);
38739                    unsigned rm = ExtractDRegister(instr, 5, 0);
38740                    // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38741                    vsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38742                    break;
38743                  }
38744                }
38745                break;
38746              }
38747              case 0x00000840: {
38748                // 0xf2000840
38749                switch (instr & 0x01000000) {
38750                  case 0x00000000: {
38751                    // 0xf2000840
38752                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
38753                    if (dt.Is(kDataTypeValueInvalid)) {
38754                      UnallocatedA32(instr);
38755                      return;
38756                    }
38757                    if (((instr >> 12) & 1) != 0) {
38758                      UnallocatedA32(instr);
38759                      return;
38760                    }
38761                    unsigned rd = ExtractQRegister(instr, 22, 12);
38762                    if (((instr >> 16) & 1) != 0) {
38763                      UnallocatedA32(instr);
38764                      return;
38765                    }
38766                    unsigned rn = ExtractQRegister(instr, 7, 16);
38767                    if ((instr & 1) != 0) {
38768                      UnallocatedA32(instr);
38769                      return;
38770                    }
38771                    unsigned rm = ExtractQRegister(instr, 5, 0);
38772                    // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38773                    vadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38774                    break;
38775                  }
38776                  case 0x01000000: {
38777                    // 0xf3000840
38778                    DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
38779                    if (dt.Is(kDataTypeValueInvalid)) {
38780                      UnallocatedA32(instr);
38781                      return;
38782                    }
38783                    if (((instr >> 12) & 1) != 0) {
38784                      UnallocatedA32(instr);
38785                      return;
38786                    }
38787                    unsigned rd = ExtractQRegister(instr, 22, 12);
38788                    if (((instr >> 16) & 1) != 0) {
38789                      UnallocatedA32(instr);
38790                      return;
38791                    }
38792                    unsigned rn = ExtractQRegister(instr, 7, 16);
38793                    if ((instr & 1) != 0) {
38794                      UnallocatedA32(instr);
38795                      return;
38796                    }
38797                    unsigned rm = ExtractQRegister(instr, 5, 0);
38798                    // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38799                    vsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38800                    break;
38801                  }
38802                }
38803                break;
38804              }
38805              case 0x00000900: {
38806                // 0xf2000900
38807                switch (instr & 0x01000000) {
38808                  case 0x00000000: {
38809                    // 0xf2000900
38810                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
38811                    if (dt.Is(kDataTypeValueInvalid)) {
38812                      UnallocatedA32(instr);
38813                      return;
38814                    }
38815                    unsigned rd = ExtractDRegister(instr, 22, 12);
38816                    unsigned rn = ExtractDRegister(instr, 7, 16);
38817                    unsigned rm = ExtractDRegister(instr, 5, 0);
38818                    // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
38819                    vmla(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38820                    break;
38821                  }
38822                  case 0x01000000: {
38823                    // 0xf3000900
38824                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
38825                    if (dt.Is(kDataTypeValueInvalid)) {
38826                      UnallocatedA32(instr);
38827                      return;
38828                    }
38829                    unsigned rd = ExtractDRegister(instr, 22, 12);
38830                    unsigned rn = ExtractDRegister(instr, 7, 16);
38831                    unsigned rm = ExtractDRegister(instr, 5, 0);
38832                    // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
38833                    vmls(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38834                    break;
38835                  }
38836                }
38837                break;
38838              }
38839              case 0x00000940: {
38840                // 0xf2000940
38841                switch (instr & 0x01000000) {
38842                  case 0x00000000: {
38843                    // 0xf2000940
38844                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
38845                    if (dt.Is(kDataTypeValueInvalid)) {
38846                      UnallocatedA32(instr);
38847                      return;
38848                    }
38849                    if (((instr >> 12) & 1) != 0) {
38850                      UnallocatedA32(instr);
38851                      return;
38852                    }
38853                    unsigned rd = ExtractQRegister(instr, 22, 12);
38854                    if (((instr >> 16) & 1) != 0) {
38855                      UnallocatedA32(instr);
38856                      return;
38857                    }
38858                    unsigned rn = ExtractQRegister(instr, 7, 16);
38859                    if ((instr & 1) != 0) {
38860                      UnallocatedA32(instr);
38861                      return;
38862                    }
38863                    unsigned rm = ExtractQRegister(instr, 5, 0);
38864                    // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
38865                    vmla(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38866                    break;
38867                  }
38868                  case 0x01000000: {
38869                    // 0xf3000940
38870                    DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
38871                    if (dt.Is(kDataTypeValueInvalid)) {
38872                      UnallocatedA32(instr);
38873                      return;
38874                    }
38875                    if (((instr >> 12) & 1) != 0) {
38876                      UnallocatedA32(instr);
38877                      return;
38878                    }
38879                    unsigned rd = ExtractQRegister(instr, 22, 12);
38880                    if (((instr >> 16) & 1) != 0) {
38881                      UnallocatedA32(instr);
38882                      return;
38883                    }
38884                    unsigned rn = ExtractQRegister(instr, 7, 16);
38885                    if ((instr & 1) != 0) {
38886                      UnallocatedA32(instr);
38887                      return;
38888                    }
38889                    unsigned rm = ExtractQRegister(instr, 5, 0);
38890                    // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
38891                    vmls(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38892                    break;
38893                  }
38894                }
38895                break;
38896              }
38897              case 0x00000a00: {
38898                // 0xf2000a00
38899                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38900                                                 ((instr >> 22) & 0x4));
38901                if (dt.Is(kDataTypeValueInvalid)) {
38902                  UnallocatedA32(instr);
38903                  return;
38904                }
38905                unsigned rd = ExtractDRegister(instr, 22, 12);
38906                unsigned rn = ExtractDRegister(instr, 7, 16);
38907                unsigned rm = ExtractDRegister(instr, 5, 0);
38908                // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38909                vpmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38910                break;
38911              }
38912              case 0x00000b00: {
38913                // 0xf2000b00
38914                switch (instr & 0x01000000) {
38915                  case 0x00000000: {
38916                    // 0xf2000b00
38917                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
38918                    if (dt.Is(kDataTypeValueInvalid)) {
38919                      UnallocatedA32(instr);
38920                      return;
38921                    }
38922                    unsigned rd = ExtractDRegister(instr, 22, 12);
38923                    unsigned rn = ExtractDRegister(instr, 7, 16);
38924                    unsigned rm = ExtractDRegister(instr, 5, 0);
38925                    // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38926                    vqdmulh(al,
38927                            dt,
38928                            DRegister(rd),
38929                            DRegister(rn),
38930                            DRegister(rm));
38931                    break;
38932                  }
38933                  case 0x01000000: {
38934                    // 0xf3000b00
38935                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
38936                    if (dt.Is(kDataTypeValueInvalid)) {
38937                      UnallocatedA32(instr);
38938                      return;
38939                    }
38940                    unsigned rd = ExtractDRegister(instr, 22, 12);
38941                    unsigned rn = ExtractDRegister(instr, 7, 16);
38942                    unsigned rm = ExtractDRegister(instr, 5, 0);
38943                    // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38944                    vqrdmulh(al,
38945                             dt,
38946                             DRegister(rd),
38947                             DRegister(rn),
38948                             DRegister(rm));
38949                    break;
38950                  }
38951                }
38952                break;
38953              }
38954              case 0x00000b40: {
38955                // 0xf2000b40
38956                switch (instr & 0x01000000) {
38957                  case 0x00000000: {
38958                    // 0xf2000b40
38959                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
38960                    if (dt.Is(kDataTypeValueInvalid)) {
38961                      UnallocatedA32(instr);
38962                      return;
38963                    }
38964                    if (((instr >> 12) & 1) != 0) {
38965                      UnallocatedA32(instr);
38966                      return;
38967                    }
38968                    unsigned rd = ExtractQRegister(instr, 22, 12);
38969                    if (((instr >> 16) & 1) != 0) {
38970                      UnallocatedA32(instr);
38971                      return;
38972                    }
38973                    unsigned rn = ExtractQRegister(instr, 7, 16);
38974                    if ((instr & 1) != 0) {
38975                      UnallocatedA32(instr);
38976                      return;
38977                    }
38978                    unsigned rm = ExtractQRegister(instr, 5, 0);
38979                    // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38980                    vqdmulh(al,
38981                            dt,
38982                            QRegister(rd),
38983                            QRegister(rn),
38984                            QRegister(rm));
38985                    break;
38986                  }
38987                  case 0x01000000: {
38988                    // 0xf3000b40
38989                    DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
38990                    if (dt.Is(kDataTypeValueInvalid)) {
38991                      UnallocatedA32(instr);
38992                      return;
38993                    }
38994                    if (((instr >> 12) & 1) != 0) {
38995                      UnallocatedA32(instr);
38996                      return;
38997                    }
38998                    unsigned rd = ExtractQRegister(instr, 22, 12);
38999                    if (((instr >> 16) & 1) != 0) {
39000                      UnallocatedA32(instr);
39001                      return;
39002                    }
39003                    unsigned rn = ExtractQRegister(instr, 7, 16);
39004                    if ((instr & 1) != 0) {
39005                      UnallocatedA32(instr);
39006                      return;
39007                    }
39008                    unsigned rm = ExtractQRegister(instr, 5, 0);
39009                    // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39010                    vqrdmulh(al,
39011                             dt,
39012                             QRegister(rd),
39013                             QRegister(rn),
39014                             QRegister(rm));
39015                    break;
39016                  }
39017                }
39018                break;
39019              }
39020              case 0x00000c40: {
39021                // 0xf2000c40
39022                switch (instr & 0x01300000) {
39023                  case 0x00000000: {
39024                    // 0xf2000c40
39025                    UnimplementedA32("SHA1C", instr);
39026                    break;
39027                  }
39028                  case 0x00100000: {
39029                    // 0xf2100c40
39030                    UnimplementedA32("SHA1P", instr);
39031                    break;
39032                  }
39033                  case 0x00200000: {
39034                    // 0xf2200c40
39035                    UnimplementedA32("SHA1M", instr);
39036                    break;
39037                  }
39038                  case 0x00300000: {
39039                    // 0xf2300c40
39040                    UnimplementedA32("SHA1SU0", instr);
39041                    break;
39042                  }
39043                  case 0x01000000: {
39044                    // 0xf3000c40
39045                    UnimplementedA32("SHA256H", instr);
39046                    break;
39047                  }
39048                  case 0x01100000: {
39049                    // 0xf3100c40
39050                    UnimplementedA32("SHA256H2", instr);
39051                    break;
39052                  }
39053                  case 0x01200000: {
39054                    // 0xf3200c40
39055                    UnimplementedA32("SHA256SU1", instr);
39056                    break;
39057                  }
39058                  default:
39059                    UnallocatedA32(instr);
39060                    break;
39061                }
39062                break;
39063              }
39064              case 0x00000d00: {
39065                // 0xf2000d00
39066                switch (instr & 0x01300000) {
39067                  case 0x00000000: {
39068                    // 0xf2000d00
39069                    unsigned rd = ExtractDRegister(instr, 22, 12);
39070                    unsigned rn = ExtractDRegister(instr, 7, 16);
39071                    unsigned rm = ExtractDRegister(instr, 5, 0);
39072                    // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39073                    vadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39074                    break;
39075                  }
39076                  case 0x00200000: {
39077                    // 0xf2200d00
39078                    unsigned rd = ExtractDRegister(instr, 22, 12);
39079                    unsigned rn = ExtractDRegister(instr, 7, 16);
39080                    unsigned rm = ExtractDRegister(instr, 5, 0);
39081                    // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39082                    vsub(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39083                    break;
39084                  }
39085                  case 0x01000000: {
39086                    // 0xf3000d00
39087                    unsigned rd = ExtractDRegister(instr, 22, 12);
39088                    unsigned rn = ExtractDRegister(instr, 7, 16);
39089                    unsigned rm = ExtractDRegister(instr, 5, 0);
39090                    // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39091                    vpadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39092                    break;
39093                  }
39094                  case 0x01200000: {
39095                    // 0xf3200d00
39096                    unsigned rd = ExtractDRegister(instr, 22, 12);
39097                    unsigned rn = ExtractDRegister(instr, 7, 16);
39098                    unsigned rm = ExtractDRegister(instr, 5, 0);
39099                    // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39100                    vabd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39101                    break;
39102                  }
39103                  default:
39104                    UnallocatedA32(instr);
39105                    break;
39106                }
39107                break;
39108              }
39109              case 0x00000d40: {
39110                // 0xf2000d40
39111                switch (instr & 0x01300000) {
39112                  case 0x00000000: {
39113                    // 0xf2000d40
39114                    if (((instr >> 12) & 1) != 0) {
39115                      UnallocatedA32(instr);
39116                      return;
39117                    }
39118                    unsigned rd = ExtractQRegister(instr, 22, 12);
39119                    if (((instr >> 16) & 1) != 0) {
39120                      UnallocatedA32(instr);
39121                      return;
39122                    }
39123                    unsigned rn = ExtractQRegister(instr, 7, 16);
39124                    if ((instr & 1) != 0) {
39125                      UnallocatedA32(instr);
39126                      return;
39127                    }
39128                    unsigned rm = ExtractQRegister(instr, 5, 0);
39129                    // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39130                    vadd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39131                    break;
39132                  }
39133                  case 0x00200000: {
39134                    // 0xf2200d40
39135                    if (((instr >> 12) & 1) != 0) {
39136                      UnallocatedA32(instr);
39137                      return;
39138                    }
39139                    unsigned rd = ExtractQRegister(instr, 22, 12);
39140                    if (((instr >> 16) & 1) != 0) {
39141                      UnallocatedA32(instr);
39142                      return;
39143                    }
39144                    unsigned rn = ExtractQRegister(instr, 7, 16);
39145                    if ((instr & 1) != 0) {
39146                      UnallocatedA32(instr);
39147                      return;
39148                    }
39149                    unsigned rm = ExtractQRegister(instr, 5, 0);
39150                    // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39151                    vsub(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39152                    break;
39153                  }
39154                  case 0x01200000: {
39155                    // 0xf3200d40
39156                    if (((instr >> 12) & 1) != 0) {
39157                      UnallocatedA32(instr);
39158                      return;
39159                    }
39160                    unsigned rd = ExtractQRegister(instr, 22, 12);
39161                    if (((instr >> 16) & 1) != 0) {
39162                      UnallocatedA32(instr);
39163                      return;
39164                    }
39165                    unsigned rn = ExtractQRegister(instr, 7, 16);
39166                    if ((instr & 1) != 0) {
39167                      UnallocatedA32(instr);
39168                      return;
39169                    }
39170                    unsigned rm = ExtractQRegister(instr, 5, 0);
39171                    // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39172                    vabd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39173                    break;
39174                  }
39175                  default:
39176                    UnallocatedA32(instr);
39177                    break;
39178                }
39179                break;
39180              }
39181              case 0x00000e00: {
39182                // 0xf2000e00
39183                switch (instr & 0x01200000) {
39184                  case 0x00000000: {
39185                    // 0xf2000e00
39186                    DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
39187                    if (dt.Is(kDataTypeValueInvalid)) {
39188                      UnallocatedA32(instr);
39189                      return;
39190                    }
39191                    unsigned rd = ExtractDRegister(instr, 22, 12);
39192                    unsigned rn = ExtractDRegister(instr, 7, 16);
39193                    unsigned rm = ExtractDRegister(instr, 5, 0);
39194                    // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A2
39195                    vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39196                    break;
39197                  }
39198                  case 0x01000000: {
39199                    // 0xf3000e00
39200                    if ((instr & 0x00100000) == 0x00000000) {
39201                      unsigned rd = ExtractDRegister(instr, 22, 12);
39202                      unsigned rn = ExtractDRegister(instr, 7, 16);
39203                      unsigned rm = ExtractDRegister(instr, 5, 0);
39204                      // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
39205                      vcge(al,
39206                           F32,
39207                           DRegister(rd),
39208                           DRegister(rn),
39209                           DRegister(rm));
39210                    } else {
39211                      UnallocatedA32(instr);
39212                    }
39213                    break;
39214                  }
39215                  case 0x01200000: {
39216                    // 0xf3200e00
39217                    if ((instr & 0x00100000) == 0x00000000) {
39218                      unsigned rd = ExtractDRegister(instr, 22, 12);
39219                      unsigned rn = ExtractDRegister(instr, 7, 16);
39220                      unsigned rm = ExtractDRegister(instr, 5, 0);
39221                      // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
39222                      vcgt(al,
39223                           F32,
39224                           DRegister(rd),
39225                           DRegister(rn),
39226                           DRegister(rm));
39227                    } else {
39228                      UnallocatedA32(instr);
39229                    }
39230                    break;
39231                  }
39232                  default:
39233                    UnallocatedA32(instr);
39234                    break;
39235                }
39236                break;
39237              }
39238              case 0x00000e40: {
39239                // 0xf2000e40
39240                switch (instr & 0x01200000) {
39241                  case 0x00000000: {
39242                    // 0xf2000e40
39243                    DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
39244                    if (dt.Is(kDataTypeValueInvalid)) {
39245                      UnallocatedA32(instr);
39246                      return;
39247                    }
39248                    if (((instr >> 12) & 1) != 0) {
39249                      UnallocatedA32(instr);
39250                      return;
39251                    }
39252                    unsigned rd = ExtractQRegister(instr, 22, 12);
39253                    if (((instr >> 16) & 1) != 0) {
39254                      UnallocatedA32(instr);
39255                      return;
39256                    }
39257                    unsigned rn = ExtractQRegister(instr, 7, 16);
39258                    if ((instr & 1) != 0) {
39259                      UnallocatedA32(instr);
39260                      return;
39261                    }
39262                    unsigned rm = ExtractQRegister(instr, 5, 0);
39263                    // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A2
39264                    vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39265                    break;
39266                  }
39267                  case 0x01000000: {
39268                    // 0xf3000e40
39269                    if ((instr & 0x00100000) == 0x00000000) {
39270                      if (((instr >> 12) & 1) != 0) {
39271                        UnallocatedA32(instr);
39272                        return;
39273                      }
39274                      unsigned rd = ExtractQRegister(instr, 22, 12);
39275                      if (((instr >> 16) & 1) != 0) {
39276                        UnallocatedA32(instr);
39277                        return;
39278                      }
39279                      unsigned rn = ExtractQRegister(instr, 7, 16);
39280                      if ((instr & 1) != 0) {
39281                        UnallocatedA32(instr);
39282                        return;
39283                      }
39284                      unsigned rm = ExtractQRegister(instr, 5, 0);
39285                      // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
39286                      vcge(al,
39287                           F32,
39288                           QRegister(rd),
39289                           QRegister(rn),
39290                           QRegister(rm));
39291                    } else {
39292                      UnallocatedA32(instr);
39293                    }
39294                    break;
39295                  }
39296                  case 0x01200000: {
39297                    // 0xf3200e40
39298                    if ((instr & 0x00100000) == 0x00000000) {
39299                      if (((instr >> 12) & 1) != 0) {
39300                        UnallocatedA32(instr);
39301                        return;
39302                      }
39303                      unsigned rd = ExtractQRegister(instr, 22, 12);
39304                      if (((instr >> 16) & 1) != 0) {
39305                        UnallocatedA32(instr);
39306                        return;
39307                      }
39308                      unsigned rn = ExtractQRegister(instr, 7, 16);
39309                      if ((instr & 1) != 0) {
39310                        UnallocatedA32(instr);
39311                        return;
39312                      }
39313                      unsigned rm = ExtractQRegister(instr, 5, 0);
39314                      // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
39315                      vcgt(al,
39316                           F32,
39317                           QRegister(rd),
39318                           QRegister(rn),
39319                           QRegister(rm));
39320                    } else {
39321                      UnallocatedA32(instr);
39322                    }
39323                    break;
39324                  }
39325                  default:
39326                    UnallocatedA32(instr);
39327                    break;
39328                }
39329                break;
39330              }
39331              case 0x00000f00: {
39332                // 0xf2000f00
39333                switch (instr & 0x01300000) {
39334                  case 0x00000000: {
39335                    // 0xf2000f00
39336                    unsigned rd = ExtractDRegister(instr, 22, 12);
39337                    unsigned rn = ExtractDRegister(instr, 7, 16);
39338                    unsigned rm = ExtractDRegister(instr, 5, 0);
39339                    // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39340                    vmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39341                    break;
39342                  }
39343                  case 0x00200000: {
39344                    // 0xf2200f00
39345                    unsigned rd = ExtractDRegister(instr, 22, 12);
39346                    unsigned rn = ExtractDRegister(instr, 7, 16);
39347                    unsigned rm = ExtractDRegister(instr, 5, 0);
39348                    // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39349                    vmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39350                    break;
39351                  }
39352                  case 0x01000000: {
39353                    // 0xf3000f00
39354                    unsigned rd = ExtractDRegister(instr, 22, 12);
39355                    unsigned rn = ExtractDRegister(instr, 7, 16);
39356                    unsigned rm = ExtractDRegister(instr, 5, 0);
39357                    // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39358                    vpmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39359                    break;
39360                  }
39361                  case 0x01200000: {
39362                    // 0xf3200f00
39363                    unsigned rd = ExtractDRegister(instr, 22, 12);
39364                    unsigned rn = ExtractDRegister(instr, 7, 16);
39365                    unsigned rm = ExtractDRegister(instr, 5, 0);
39366                    // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39367                    vpmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39368                    break;
39369                  }
39370                  default:
39371                    UnallocatedA32(instr);
39372                    break;
39373                }
39374                break;
39375              }
39376              case 0x00000f40: {
39377                // 0xf2000f40
39378                switch (instr & 0x01300000) {
39379                  case 0x00000000: {
39380                    // 0xf2000f40
39381                    if (((instr >> 12) & 1) != 0) {
39382                      UnallocatedA32(instr);
39383                      return;
39384                    }
39385                    unsigned rd = ExtractQRegister(instr, 22, 12);
39386                    if (((instr >> 16) & 1) != 0) {
39387                      UnallocatedA32(instr);
39388                      return;
39389                    }
39390                    unsigned rn = ExtractQRegister(instr, 7, 16);
39391                    if ((instr & 1) != 0) {
39392                      UnallocatedA32(instr);
39393                      return;
39394                    }
39395                    unsigned rm = ExtractQRegister(instr, 5, 0);
39396                    // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39397                    vmax(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39398                    break;
39399                  }
39400                  case 0x00200000: {
39401                    // 0xf2200f40
39402                    if (((instr >> 12) & 1) != 0) {
39403                      UnallocatedA32(instr);
39404                      return;
39405                    }
39406                    unsigned rd = ExtractQRegister(instr, 22, 12);
39407                    if (((instr >> 16) & 1) != 0) {
39408                      UnallocatedA32(instr);
39409                      return;
39410                    }
39411                    unsigned rn = ExtractQRegister(instr, 7, 16);
39412                    if ((instr & 1) != 0) {
39413                      UnallocatedA32(instr);
39414                      return;
39415                    }
39416                    unsigned rm = ExtractQRegister(instr, 5, 0);
39417                    // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39418                    vmin(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39419                    break;
39420                  }
39421                  default:
39422                    UnallocatedA32(instr);
39423                    break;
39424                }
39425                break;
39426              }
39427              default:
39428                UnallocatedA32(instr);
39429                break;
39430            }
39431            break;
39432          }
39433          case 0x00000010: {
39434            // 0xf2000010
39435            switch (instr & 0x00000f40) {
39436              case 0x00000000: {
39437                // 0xf2000010
39438                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39439                                                 ((instr >> 22) & 0x4));
39440                if (dt.Is(kDataTypeValueInvalid)) {
39441                  UnallocatedA32(instr);
39442                  return;
39443                }
39444                unsigned rd = ExtractDRegister(instr, 22, 12);
39445                unsigned rn = ExtractDRegister(instr, 7, 16);
39446                unsigned rm = ExtractDRegister(instr, 5, 0);
39447                // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39448                vqadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39449                break;
39450              }
39451              case 0x00000040: {
39452                // 0xf2000050
39453                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39454                                                 ((instr >> 22) & 0x4));
39455                if (dt.Is(kDataTypeValueInvalid)) {
39456                  UnallocatedA32(instr);
39457                  return;
39458                }
39459                if (((instr >> 12) & 1) != 0) {
39460                  UnallocatedA32(instr);
39461                  return;
39462                }
39463                unsigned rd = ExtractQRegister(instr, 22, 12);
39464                if (((instr >> 16) & 1) != 0) {
39465                  UnallocatedA32(instr);
39466                  return;
39467                }
39468                unsigned rn = ExtractQRegister(instr, 7, 16);
39469                if ((instr & 1) != 0) {
39470                  UnallocatedA32(instr);
39471                  return;
39472                }
39473                unsigned rm = ExtractQRegister(instr, 5, 0);
39474                // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39475                vqadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39476                break;
39477              }
39478              case 0x00000100: {
39479                // 0xf2000110
39480                switch (instr & 0x01300000) {
39481                  case 0x00000000: {
39482                    // 0xf2000110
39483                    unsigned rd = ExtractDRegister(instr, 22, 12);
39484                    unsigned rn = ExtractDRegister(instr, 7, 16);
39485                    unsigned rm = ExtractDRegister(instr, 5, 0);
39486                    // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39487                    vand(al,
39488                         kDataTypeValueNone,
39489                         DRegister(rd),
39490                         DRegister(rn),
39491                         DRegister(rm));
39492                    break;
39493                  }
39494                  case 0x00100000: {
39495                    // 0xf2100110
39496                    unsigned rd = ExtractDRegister(instr, 22, 12);
39497                    unsigned rn = ExtractDRegister(instr, 7, 16);
39498                    unsigned rm = ExtractDRegister(instr, 5, 0);
39499                    // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39500                    vbic(al,
39501                         kDataTypeValueNone,
39502                         DRegister(rd),
39503                         DRegister(rn),
39504                         DRegister(rm));
39505                    break;
39506                  }
39507                  case 0x00200000: {
39508                    // 0xf2200110
39509                    if (((instr & 0x00000040) == 0x00000000) &&
39510                        ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
39511                          (Uint32((instr >> 16)) & Uint32(0xf))) ==
39512                         (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
39513                          (Uint32(instr) & Uint32(0xf))))) {
39514                      unsigned rd = ExtractDRegister(instr, 22, 12);
39515                      unsigned rm = ExtractDRegister(instr, 7, 16);
39516                      // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
39517                      vmov(al,
39518                           kDataTypeValueNone,
39519                           DRegister(rd),
39520                           DRegister(rm));
39521                      return;
39522                    }
39523                    unsigned rd = ExtractDRegister(instr, 22, 12);
39524                    unsigned rn = ExtractDRegister(instr, 7, 16);
39525                    unsigned rm = ExtractDRegister(instr, 5, 0);
39526                    // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39527                    vorr(al,
39528                         kDataTypeValueNone,
39529                         DRegister(rd),
39530                         DRegister(rn),
39531                         DRegister(rm));
39532                    break;
39533                  }
39534                  case 0x00300000: {
39535                    // 0xf2300110
39536                    unsigned rd = ExtractDRegister(instr, 22, 12);
39537                    unsigned rn = ExtractDRegister(instr, 7, 16);
39538                    unsigned rm = ExtractDRegister(instr, 5, 0);
39539                    // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39540                    vorn(al,
39541                         kDataTypeValueNone,
39542                         DRegister(rd),
39543                         DRegister(rn),
39544                         DRegister(rm));
39545                    break;
39546                  }
39547                  case 0x01000000: {
39548                    // 0xf3000110
39549                    unsigned rd = ExtractDRegister(instr, 22, 12);
39550                    unsigned rn = ExtractDRegister(instr, 7, 16);
39551                    unsigned rm = ExtractDRegister(instr, 5, 0);
39552                    // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39553                    veor(al,
39554                         kDataTypeValueNone,
39555                         DRegister(rd),
39556                         DRegister(rn),
39557                         DRegister(rm));
39558                    break;
39559                  }
39560                  case 0x01100000: {
39561                    // 0xf3100110
39562                    unsigned rd = ExtractDRegister(instr, 22, 12);
39563                    unsigned rn = ExtractDRegister(instr, 7, 16);
39564                    unsigned rm = ExtractDRegister(instr, 5, 0);
39565                    // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39566                    vbsl(al,
39567                         kDataTypeValueNone,
39568                         DRegister(rd),
39569                         DRegister(rn),
39570                         DRegister(rm));
39571                    break;
39572                  }
39573                  case 0x01200000: {
39574                    // 0xf3200110
39575                    unsigned rd = ExtractDRegister(instr, 22, 12);
39576                    unsigned rn = ExtractDRegister(instr, 7, 16);
39577                    unsigned rm = ExtractDRegister(instr, 5, 0);
39578                    // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39579                    vbit(al,
39580                         kDataTypeValueNone,
39581                         DRegister(rd),
39582                         DRegister(rn),
39583                         DRegister(rm));
39584                    break;
39585                  }
39586                  case 0x01300000: {
39587                    // 0xf3300110
39588                    unsigned rd = ExtractDRegister(instr, 22, 12);
39589                    unsigned rn = ExtractDRegister(instr, 7, 16);
39590                    unsigned rm = ExtractDRegister(instr, 5, 0);
39591                    // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39592                    vbif(al,
39593                         kDataTypeValueNone,
39594                         DRegister(rd),
39595                         DRegister(rn),
39596                         DRegister(rm));
39597                    break;
39598                  }
39599                }
39600                break;
39601              }
39602              case 0x00000140: {
39603                // 0xf2000150
39604                switch (instr & 0x01300000) {
39605                  case 0x00000000: {
39606                    // 0xf2000150
39607                    if (((instr >> 12) & 1) != 0) {
39608                      UnallocatedA32(instr);
39609                      return;
39610                    }
39611                    unsigned rd = ExtractQRegister(instr, 22, 12);
39612                    if (((instr >> 16) & 1) != 0) {
39613                      UnallocatedA32(instr);
39614                      return;
39615                    }
39616                    unsigned rn = ExtractQRegister(instr, 7, 16);
39617                    if ((instr & 1) != 0) {
39618                      UnallocatedA32(instr);
39619                      return;
39620                    }
39621                    unsigned rm = ExtractQRegister(instr, 5, 0);
39622                    // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39623                    vand(al,
39624                         kDataTypeValueNone,
39625                         QRegister(rd),
39626                         QRegister(rn),
39627                         QRegister(rm));
39628                    break;
39629                  }
39630                  case 0x00100000: {
39631                    // 0xf2100150
39632                    if (((instr >> 12) & 1) != 0) {
39633                      UnallocatedA32(instr);
39634                      return;
39635                    }
39636                    unsigned rd = ExtractQRegister(instr, 22, 12);
39637                    if (((instr >> 16) & 1) != 0) {
39638                      UnallocatedA32(instr);
39639                      return;
39640                    }
39641                    unsigned rn = ExtractQRegister(instr, 7, 16);
39642                    if ((instr & 1) != 0) {
39643                      UnallocatedA32(instr);
39644                      return;
39645                    }
39646                    unsigned rm = ExtractQRegister(instr, 5, 0);
39647                    // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39648                    vbic(al,
39649                         kDataTypeValueNone,
39650                         QRegister(rd),
39651                         QRegister(rn),
39652                         QRegister(rm));
39653                    break;
39654                  }
39655                  case 0x00200000: {
39656                    // 0xf2200150
39657                    if (((instr & 0x00000040) == 0x00000040) &&
39658                        ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
39659                          (Uint32((instr >> 16)) & Uint32(0xf))) ==
39660                         (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
39661                          (Uint32(instr) & Uint32(0xf))))) {
39662                      if (((instr >> 12) & 1) != 0) {
39663                        UnallocatedA32(instr);
39664                        return;
39665                      }
39666                      unsigned rd = ExtractQRegister(instr, 22, 12);
39667                      if (((instr >> 16) & 1) != 0) {
39668                        UnallocatedA32(instr);
39669                        return;
39670                      }
39671                      unsigned rm = ExtractQRegister(instr, 7, 16);
39672                      // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
39673                      vmov(al,
39674                           kDataTypeValueNone,
39675                           QRegister(rd),
39676                           QRegister(rm));
39677                      return;
39678                    }
39679                    if (((instr >> 12) & 1) != 0) {
39680                      UnallocatedA32(instr);
39681                      return;
39682                    }
39683                    unsigned rd = ExtractQRegister(instr, 22, 12);
39684                    if (((instr >> 16) & 1) != 0) {
39685                      UnallocatedA32(instr);
39686                      return;
39687                    }
39688                    unsigned rn = ExtractQRegister(instr, 7, 16);
39689                    if ((instr & 1) != 0) {
39690                      UnallocatedA32(instr);
39691                      return;
39692                    }
39693                    unsigned rm = ExtractQRegister(instr, 5, 0);
39694                    // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39695                    vorr(al,
39696                         kDataTypeValueNone,
39697                         QRegister(rd),
39698                         QRegister(rn),
39699                         QRegister(rm));
39700                    break;
39701                  }
39702                  case 0x00300000: {
39703                    // 0xf2300150
39704                    if (((instr >> 12) & 1) != 0) {
39705                      UnallocatedA32(instr);
39706                      return;
39707                    }
39708                    unsigned rd = ExtractQRegister(instr, 22, 12);
39709                    if (((instr >> 16) & 1) != 0) {
39710                      UnallocatedA32(instr);
39711                      return;
39712                    }
39713                    unsigned rn = ExtractQRegister(instr, 7, 16);
39714                    if ((instr & 1) != 0) {
39715                      UnallocatedA32(instr);
39716                      return;
39717                    }
39718                    unsigned rm = ExtractQRegister(instr, 5, 0);
39719                    // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39720                    vorn(al,
39721                         kDataTypeValueNone,
39722                         QRegister(rd),
39723                         QRegister(rn),
39724                         QRegister(rm));
39725                    break;
39726                  }
39727                  case 0x01000000: {
39728                    // 0xf3000150
39729                    if (((instr >> 12) & 1) != 0) {
39730                      UnallocatedA32(instr);
39731                      return;
39732                    }
39733                    unsigned rd = ExtractQRegister(instr, 22, 12);
39734                    if (((instr >> 16) & 1) != 0) {
39735                      UnallocatedA32(instr);
39736                      return;
39737                    }
39738                    unsigned rn = ExtractQRegister(instr, 7, 16);
39739                    if ((instr & 1) != 0) {
39740                      UnallocatedA32(instr);
39741                      return;
39742                    }
39743                    unsigned rm = ExtractQRegister(instr, 5, 0);
39744                    // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39745                    veor(al,
39746                         kDataTypeValueNone,
39747                         QRegister(rd),
39748                         QRegister(rn),
39749                         QRegister(rm));
39750                    break;
39751                  }
39752                  case 0x01100000: {
39753                    // 0xf3100150
39754                    if (((instr >> 12) & 1) != 0) {
39755                      UnallocatedA32(instr);
39756                      return;
39757                    }
39758                    unsigned rd = ExtractQRegister(instr, 22, 12);
39759                    if (((instr >> 16) & 1) != 0) {
39760                      UnallocatedA32(instr);
39761                      return;
39762                    }
39763                    unsigned rn = ExtractQRegister(instr, 7, 16);
39764                    if ((instr & 1) != 0) {
39765                      UnallocatedA32(instr);
39766                      return;
39767                    }
39768                    unsigned rm = ExtractQRegister(instr, 5, 0);
39769                    // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39770                    vbsl(al,
39771                         kDataTypeValueNone,
39772                         QRegister(rd),
39773                         QRegister(rn),
39774                         QRegister(rm));
39775                    break;
39776                  }
39777                  case 0x01200000: {
39778                    // 0xf3200150
39779                    if (((instr >> 12) & 1) != 0) {
39780                      UnallocatedA32(instr);
39781                      return;
39782                    }
39783                    unsigned rd = ExtractQRegister(instr, 22, 12);
39784                    if (((instr >> 16) & 1) != 0) {
39785                      UnallocatedA32(instr);
39786                      return;
39787                    }
39788                    unsigned rn = ExtractQRegister(instr, 7, 16);
39789                    if ((instr & 1) != 0) {
39790                      UnallocatedA32(instr);
39791                      return;
39792                    }
39793                    unsigned rm = ExtractQRegister(instr, 5, 0);
39794                    // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39795                    vbit(al,
39796                         kDataTypeValueNone,
39797                         QRegister(rd),
39798                         QRegister(rn),
39799                         QRegister(rm));
39800                    break;
39801                  }
39802                  case 0x01300000: {
39803                    // 0xf3300150
39804                    if (((instr >> 12) & 1) != 0) {
39805                      UnallocatedA32(instr);
39806                      return;
39807                    }
39808                    unsigned rd = ExtractQRegister(instr, 22, 12);
39809                    if (((instr >> 16) & 1) != 0) {
39810                      UnallocatedA32(instr);
39811                      return;
39812                    }
39813                    unsigned rn = ExtractQRegister(instr, 7, 16);
39814                    if ((instr & 1) != 0) {
39815                      UnallocatedA32(instr);
39816                      return;
39817                    }
39818                    unsigned rm = ExtractQRegister(instr, 5, 0);
39819                    // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39820                    vbif(al,
39821                         kDataTypeValueNone,
39822                         QRegister(rd),
39823                         QRegister(rn),
39824                         QRegister(rm));
39825                    break;
39826                  }
39827                }
39828                break;
39829              }
39830              case 0x00000200: {
39831                // 0xf2000210
39832                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39833                                                 ((instr >> 22) & 0x4));
39834                if (dt.Is(kDataTypeValueInvalid)) {
39835                  UnallocatedA32(instr);
39836                  return;
39837                }
39838                unsigned rd = ExtractDRegister(instr, 22, 12);
39839                unsigned rn = ExtractDRegister(instr, 7, 16);
39840                unsigned rm = ExtractDRegister(instr, 5, 0);
39841                // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39842                vqsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39843                break;
39844              }
39845              case 0x00000240: {
39846                // 0xf2000250
39847                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39848                                                 ((instr >> 22) & 0x4));
39849                if (dt.Is(kDataTypeValueInvalid)) {
39850                  UnallocatedA32(instr);
39851                  return;
39852                }
39853                if (((instr >> 12) & 1) != 0) {
39854                  UnallocatedA32(instr);
39855                  return;
39856                }
39857                unsigned rd = ExtractQRegister(instr, 22, 12);
39858                if (((instr >> 16) & 1) != 0) {
39859                  UnallocatedA32(instr);
39860                  return;
39861                }
39862                unsigned rn = ExtractQRegister(instr, 7, 16);
39863                if ((instr & 1) != 0) {
39864                  UnallocatedA32(instr);
39865                  return;
39866                }
39867                unsigned rm = ExtractQRegister(instr, 5, 0);
39868                // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39869                vqsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39870                break;
39871              }
39872              case 0x00000300: {
39873                // 0xf2000310
39874                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39875                                                 ((instr >> 22) & 0x4));
39876                if (dt.Is(kDataTypeValueInvalid)) {
39877                  UnallocatedA32(instr);
39878                  return;
39879                }
39880                unsigned rd = ExtractDRegister(instr, 22, 12);
39881                unsigned rn = ExtractDRegister(instr, 7, 16);
39882                unsigned rm = ExtractDRegister(instr, 5, 0);
39883                // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39884                vcge(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39885                break;
39886              }
39887              case 0x00000340: {
39888                // 0xf2000350
39889                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39890                                                 ((instr >> 22) & 0x4));
39891                if (dt.Is(kDataTypeValueInvalid)) {
39892                  UnallocatedA32(instr);
39893                  return;
39894                }
39895                if (((instr >> 12) & 1) != 0) {
39896                  UnallocatedA32(instr);
39897                  return;
39898                }
39899                unsigned rd = ExtractQRegister(instr, 22, 12);
39900                if (((instr >> 16) & 1) != 0) {
39901                  UnallocatedA32(instr);
39902                  return;
39903                }
39904                unsigned rn = ExtractQRegister(instr, 7, 16);
39905                if ((instr & 1) != 0) {
39906                  UnallocatedA32(instr);
39907                  return;
39908                }
39909                unsigned rm = ExtractQRegister(instr, 5, 0);
39910                // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39911                vcge(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39912                break;
39913              }
39914              case 0x00000400: {
39915                // 0xf2000410
39916                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39917                                                 ((instr >> 22) & 0x4));
39918                if (dt.Is(kDataTypeValueInvalid)) {
39919                  UnallocatedA32(instr);
39920                  return;
39921                }
39922                unsigned rd = ExtractDRegister(instr, 22, 12);
39923                unsigned rm = ExtractDRegister(instr, 5, 0);
39924                unsigned rn = ExtractDRegister(instr, 7, 16);
39925                // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
39926                vqshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
39927                break;
39928              }
39929              case 0x00000440: {
39930                // 0xf2000450
39931                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39932                                                 ((instr >> 22) & 0x4));
39933                if (dt.Is(kDataTypeValueInvalid)) {
39934                  UnallocatedA32(instr);
39935                  return;
39936                }
39937                if (((instr >> 12) & 1) != 0) {
39938                  UnallocatedA32(instr);
39939                  return;
39940                }
39941                unsigned rd = ExtractQRegister(instr, 22, 12);
39942                if ((instr & 1) != 0) {
39943                  UnallocatedA32(instr);
39944                  return;
39945                }
39946                unsigned rm = ExtractQRegister(instr, 5, 0);
39947                if (((instr >> 16) & 1) != 0) {
39948                  UnallocatedA32(instr);
39949                  return;
39950                }
39951                unsigned rn = ExtractQRegister(instr, 7, 16);
39952                // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
39953                vqshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
39954                break;
39955              }
39956              case 0x00000500: {
39957                // 0xf2000510
39958                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39959                                                 ((instr >> 22) & 0x4));
39960                if (dt.Is(kDataTypeValueInvalid)) {
39961                  UnallocatedA32(instr);
39962                  return;
39963                }
39964                unsigned rd = ExtractDRegister(instr, 22, 12);
39965                unsigned rm = ExtractDRegister(instr, 5, 0);
39966                unsigned rn = ExtractDRegister(instr, 7, 16);
39967                // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
39968                vqrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
39969                break;
39970              }
39971              case 0x00000540: {
39972                // 0xf2000550
39973                DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39974                                                 ((instr >> 22) & 0x4));
39975                if (dt.Is(kDataTypeValueInvalid)) {
39976                  UnallocatedA32(instr);
39977                  return;
39978                }
39979                if (((instr >> 12) & 1) != 0) {
39980                  UnallocatedA32(instr);
39981                  return;
39982                }
39983                unsigned rd = ExtractQRegister(instr, 22, 12);
39984                if ((instr & 1) != 0) {
39985                  UnallocatedA32(instr);
39986                  return;
39987                }
39988                unsigned rm = ExtractQRegister(instr, 5, 0);
39989                if (((instr >> 16) & 1) != 0) {
39990                  UnallocatedA32(instr);
39991                  return;
39992                }
39993                unsigned rn = ExtractQRegister(instr, 7, 16);
39994                // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
39995                vqrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
39996                break;
39997              }
39998              case 0x00000600: {
39999                // 0xf2000610
40000                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40001                                                 ((instr >> 22) & 0x4));
40002                if (dt.Is(kDataTypeValueInvalid)) {
40003                  UnallocatedA32(instr);
40004                  return;
40005                }
40006                unsigned rd = ExtractDRegister(instr, 22, 12);
40007                unsigned rn = ExtractDRegister(instr, 7, 16);
40008                unsigned rm = ExtractDRegister(instr, 5, 0);
40009                // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40010                vmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40011                break;
40012              }
40013              case 0x00000640: {
40014                // 0xf2000650
40015                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40016                                                 ((instr >> 22) & 0x4));
40017                if (dt.Is(kDataTypeValueInvalid)) {
40018                  UnallocatedA32(instr);
40019                  return;
40020                }
40021                if (((instr >> 12) & 1) != 0) {
40022                  UnallocatedA32(instr);
40023                  return;
40024                }
40025                unsigned rd = ExtractQRegister(instr, 22, 12);
40026                if (((instr >> 16) & 1) != 0) {
40027                  UnallocatedA32(instr);
40028                  return;
40029                }
40030                unsigned rn = ExtractQRegister(instr, 7, 16);
40031                if ((instr & 1) != 0) {
40032                  UnallocatedA32(instr);
40033                  return;
40034                }
40035                unsigned rm = ExtractQRegister(instr, 5, 0);
40036                // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40037                vmin(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40038                break;
40039              }
40040              case 0x00000700: {
40041                // 0xf2000710
40042                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40043                                                 ((instr >> 22) & 0x4));
40044                if (dt.Is(kDataTypeValueInvalid)) {
40045                  UnallocatedA32(instr);
40046                  return;
40047                }
40048                unsigned rd = ExtractDRegister(instr, 22, 12);
40049                unsigned rn = ExtractDRegister(instr, 7, 16);
40050                unsigned rm = ExtractDRegister(instr, 5, 0);
40051                // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; A1
40052                vaba(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40053                break;
40054              }
40055              case 0x00000740: {
40056                // 0xf2000750
40057                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40058                                                 ((instr >> 22) & 0x4));
40059                if (dt.Is(kDataTypeValueInvalid)) {
40060                  UnallocatedA32(instr);
40061                  return;
40062                }
40063                if (((instr >> 12) & 1) != 0) {
40064                  UnallocatedA32(instr);
40065                  return;
40066                }
40067                unsigned rd = ExtractQRegister(instr, 22, 12);
40068                if (((instr >> 16) & 1) != 0) {
40069                  UnallocatedA32(instr);
40070                  return;
40071                }
40072                unsigned rn = ExtractQRegister(instr, 7, 16);
40073                if ((instr & 1) != 0) {
40074                  UnallocatedA32(instr);
40075                  return;
40076                }
40077                unsigned rm = ExtractQRegister(instr, 5, 0);
40078                // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; A1
40079                vaba(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40080                break;
40081              }
40082              case 0x00000800: {
40083                // 0xf2000810
40084                switch (instr & 0x01000000) {
40085                  case 0x00000000: {
40086                    // 0xf2000810
40087                    DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
40088                    if (dt.Is(kDataTypeValueInvalid)) {
40089                      UnallocatedA32(instr);
40090                      return;
40091                    }
40092                    unsigned rd = ExtractDRegister(instr, 22, 12);
40093                    unsigned rn = ExtractDRegister(instr, 7, 16);
40094                    unsigned rm = ExtractDRegister(instr, 5, 0);
40095                    // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40096                    vtst(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40097                    break;
40098                  }
40099                  case 0x01000000: {
40100                    // 0xf3000810
40101                    DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40102                    if (dt.Is(kDataTypeValueInvalid)) {
40103                      UnallocatedA32(instr);
40104                      return;
40105                    }
40106                    unsigned rd = ExtractDRegister(instr, 22, 12);
40107                    unsigned rn = ExtractDRegister(instr, 7, 16);
40108                    unsigned rm = ExtractDRegister(instr, 5, 0);
40109                    // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40110                    vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40111                    break;
40112                  }
40113                }
40114                break;
40115              }
40116              case 0x00000840: {
40117                // 0xf2000850
40118                switch (instr & 0x01000000) {
40119                  case 0x00000000: {
40120                    // 0xf2000850
40121                    DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
40122                    if (dt.Is(kDataTypeValueInvalid)) {
40123                      UnallocatedA32(instr);
40124                      return;
40125                    }
40126                    if (((instr >> 12) & 1) != 0) {
40127                      UnallocatedA32(instr);
40128                      return;
40129                    }
40130                    unsigned rd = ExtractQRegister(instr, 22, 12);
40131                    if (((instr >> 16) & 1) != 0) {
40132                      UnallocatedA32(instr);
40133                      return;
40134                    }
40135                    unsigned rn = ExtractQRegister(instr, 7, 16);
40136                    if ((instr & 1) != 0) {
40137                      UnallocatedA32(instr);
40138                      return;
40139                    }
40140                    unsigned rm = ExtractQRegister(instr, 5, 0);
40141                    // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40142                    vtst(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40143                    break;
40144                  }
40145                  case 0x01000000: {
40146                    // 0xf3000850
40147                    DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40148                    if (dt.Is(kDataTypeValueInvalid)) {
40149                      UnallocatedA32(instr);
40150                      return;
40151                    }
40152                    if (((instr >> 12) & 1) != 0) {
40153                      UnallocatedA32(instr);
40154                      return;
40155                    }
40156                    unsigned rd = ExtractQRegister(instr, 22, 12);
40157                    if (((instr >> 16) & 1) != 0) {
40158                      UnallocatedA32(instr);
40159                      return;
40160                    }
40161                    unsigned rn = ExtractQRegister(instr, 7, 16);
40162                    if ((instr & 1) != 0) {
40163                      UnallocatedA32(instr);
40164                      return;
40165                    }
40166                    unsigned rm = ExtractQRegister(instr, 5, 0);
40167                    // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40168                    vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40169                    break;
40170                  }
40171                }
40172                break;
40173              }
40174              case 0x00000900: {
40175                // 0xf2000910
40176                DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
40177                                                  ((instr >> 22) & 0x4));
40178                if (dt.Is(kDataTypeValueInvalid)) {
40179                  UnallocatedA32(instr);
40180                  return;
40181                }
40182                unsigned rd = ExtractDRegister(instr, 22, 12);
40183                unsigned rn = ExtractDRegister(instr, 7, 16);
40184                unsigned rm = ExtractDRegister(instr, 5, 0);
40185                // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40186                vmul(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40187                break;
40188              }
40189              case 0x00000940: {
40190                // 0xf2000950
40191                DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
40192                                                  ((instr >> 22) & 0x4));
40193                if (dt.Is(kDataTypeValueInvalid)) {
40194                  UnallocatedA32(instr);
40195                  return;
40196                }
40197                if (((instr >> 12) & 1) != 0) {
40198                  UnallocatedA32(instr);
40199                  return;
40200                }
40201                unsigned rd = ExtractQRegister(instr, 22, 12);
40202                if (((instr >> 16) & 1) != 0) {
40203                  UnallocatedA32(instr);
40204                  return;
40205                }
40206                unsigned rn = ExtractQRegister(instr, 7, 16);
40207                if ((instr & 1) != 0) {
40208                  UnallocatedA32(instr);
40209                  return;
40210                }
40211                unsigned rm = ExtractQRegister(instr, 5, 0);
40212                // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40213                vmul(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40214                break;
40215              }
40216              case 0x00000a00: {
40217                // 0xf2000a10
40218                DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40219                                                 ((instr >> 22) & 0x4));
40220                if (dt.Is(kDataTypeValueInvalid)) {
40221                  UnallocatedA32(instr);
40222                  return;
40223                }
40224                unsigned rd = ExtractDRegister(instr, 22, 12);
40225                unsigned rn = ExtractDRegister(instr, 7, 16);
40226                unsigned rm = ExtractDRegister(instr, 5, 0);
40227                // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40228                vpmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40229                break;
40230              }
40231              case 0x00000b00: {
40232                // 0xf2000b10
40233                if ((instr & 0x01000000) == 0x00000000) {
40234                  DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40235                  if (dt.Is(kDataTypeValueInvalid)) {
40236                    UnallocatedA32(instr);
40237                    return;
40238                  }
40239                  unsigned rd = ExtractDRegister(instr, 22, 12);
40240                  unsigned rn = ExtractDRegister(instr, 7, 16);
40241                  unsigned rm = ExtractDRegister(instr, 5, 0);
40242                  // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40243                  vpadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40244                } else {
40245                  UnallocatedA32(instr);
40246                }
40247                break;
40248              }
40249              case 0x00000c00: {
40250                // 0xf2000c10
40251                switch (instr & 0x01300000) {
40252                  case 0x00000000: {
40253                    // 0xf2000c10
40254                    unsigned rd = ExtractDRegister(instr, 22, 12);
40255                    unsigned rn = ExtractDRegister(instr, 7, 16);
40256                    unsigned rm = ExtractDRegister(instr, 5, 0);
40257                    // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40258                    vfma(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40259                    break;
40260                  }
40261                  case 0x00200000: {
40262                    // 0xf2200c10
40263                    unsigned rd = ExtractDRegister(instr, 22, 12);
40264                    unsigned rn = ExtractDRegister(instr, 7, 16);
40265                    unsigned rm = ExtractDRegister(instr, 5, 0);
40266                    // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40267                    vfms(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40268                    break;
40269                  }
40270                  default:
40271                    UnallocatedA32(instr);
40272                    break;
40273                }
40274                break;
40275              }
40276              case 0x00000c40: {
40277                // 0xf2000c50
40278                switch (instr & 0x01300000) {
40279                  case 0x00000000: {
40280                    // 0xf2000c50
40281                    if (((instr >> 12) & 1) != 0) {
40282                      UnallocatedA32(instr);
40283                      return;
40284                    }
40285                    unsigned rd = ExtractQRegister(instr, 22, 12);
40286                    if (((instr >> 16) & 1) != 0) {
40287                      UnallocatedA32(instr);
40288                      return;
40289                    }
40290                    unsigned rn = ExtractQRegister(instr, 7, 16);
40291                    if ((instr & 1) != 0) {
40292                      UnallocatedA32(instr);
40293                      return;
40294                    }
40295                    unsigned rm = ExtractQRegister(instr, 5, 0);
40296                    // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40297                    vfma(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40298                    break;
40299                  }
40300                  case 0x00200000: {
40301                    // 0xf2200c50
40302                    if (((instr >> 12) & 1) != 0) {
40303                      UnallocatedA32(instr);
40304                      return;
40305                    }
40306                    unsigned rd = ExtractQRegister(instr, 22, 12);
40307                    if (((instr >> 16) & 1) != 0) {
40308                      UnallocatedA32(instr);
40309                      return;
40310                    }
40311                    unsigned rn = ExtractQRegister(instr, 7, 16);
40312                    if ((instr & 1) != 0) {
40313                      UnallocatedA32(instr);
40314                      return;
40315                    }
40316                    unsigned rm = ExtractQRegister(instr, 5, 0);
40317                    // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40318                    vfms(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40319                    break;
40320                  }
40321                  default:
40322                    UnallocatedA32(instr);
40323                    break;
40324                }
40325                break;
40326              }
40327              case 0x00000d00: {
40328                // 0xf2000d10
40329                switch (instr & 0x01300000) {
40330                  case 0x00000000: {
40331                    // 0xf2000d10
40332                    unsigned rd = ExtractDRegister(instr, 22, 12);
40333                    unsigned rn = ExtractDRegister(instr, 7, 16);
40334                    unsigned rm = ExtractDRegister(instr, 5, 0);
40335                    // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40336                    vmla(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40337                    break;
40338                  }
40339                  case 0x00200000: {
40340                    // 0xf2200d10
40341                    unsigned rd = ExtractDRegister(instr, 22, 12);
40342                    unsigned rn = ExtractDRegister(instr, 7, 16);
40343                    unsigned rm = ExtractDRegister(instr, 5, 0);
40344                    // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40345                    vmls(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40346                    break;
40347                  }
40348                  case 0x01000000: {
40349                    // 0xf3000d10
40350                    unsigned rd = ExtractDRegister(instr, 22, 12);
40351                    unsigned rn = ExtractDRegister(instr, 7, 16);
40352                    unsigned rm = ExtractDRegister(instr, 5, 0);
40353                    // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40354                    vmul(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40355                    break;
40356                  }
40357                  default:
40358                    UnallocatedA32(instr);
40359                    break;
40360                }
40361                break;
40362              }
40363              case 0x00000d40: {
40364                // 0xf2000d50
40365                switch (instr & 0x01300000) {
40366                  case 0x00000000: {
40367                    // 0xf2000d50
40368                    if (((instr >> 12) & 1) != 0) {
40369                      UnallocatedA32(instr);
40370                      return;
40371                    }
40372                    unsigned rd = ExtractQRegister(instr, 22, 12);
40373                    if (((instr >> 16) & 1) != 0) {
40374                      UnallocatedA32(instr);
40375                      return;
40376                    }
40377                    unsigned rn = ExtractQRegister(instr, 7, 16);
40378                    if ((instr & 1) != 0) {
40379                      UnallocatedA32(instr);
40380                      return;
40381                    }
40382                    unsigned rm = ExtractQRegister(instr, 5, 0);
40383                    // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40384                    vmla(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40385                    break;
40386                  }
40387                  case 0x00200000: {
40388                    // 0xf2200d50
40389                    if (((instr >> 12) & 1) != 0) {
40390                      UnallocatedA32(instr);
40391                      return;
40392                    }
40393                    unsigned rd = ExtractQRegister(instr, 22, 12);
40394                    if (((instr >> 16) & 1) != 0) {
40395                      UnallocatedA32(instr);
40396                      return;
40397                    }
40398                    unsigned rn = ExtractQRegister(instr, 7, 16);
40399                    if ((instr & 1) != 0) {
40400                      UnallocatedA32(instr);
40401                      return;
40402                    }
40403                    unsigned rm = ExtractQRegister(instr, 5, 0);
40404                    // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40405                    vmls(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40406                    break;
40407                  }
40408                  case 0x01000000: {
40409                    // 0xf3000d50
40410                    if (((instr >> 12) & 1) != 0) {
40411                      UnallocatedA32(instr);
40412                      return;
40413                    }
40414                    unsigned rd = ExtractQRegister(instr, 22, 12);
40415                    if (((instr >> 16) & 1) != 0) {
40416                      UnallocatedA32(instr);
40417                      return;
40418                    }
40419                    unsigned rn = ExtractQRegister(instr, 7, 16);
40420                    if ((instr & 1) != 0) {
40421                      UnallocatedA32(instr);
40422                      return;
40423                    }
40424                    unsigned rm = ExtractQRegister(instr, 5, 0);
40425                    // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40426                    vmul(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40427                    break;
40428                  }
40429                  default:
40430                    UnallocatedA32(instr);
40431                    break;
40432                }
40433                break;
40434              }
40435              case 0x00000e00: {
40436                // 0xf2000e10
40437                switch (instr & 0x01300000) {
40438                  case 0x01000000: {
40439                    // 0xf3000e10
40440                    unsigned rd = ExtractDRegister(instr, 22, 12);
40441                    unsigned rn = ExtractDRegister(instr, 7, 16);
40442                    unsigned rm = ExtractDRegister(instr, 5, 0);
40443                    // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40444                    vacge(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40445                    break;
40446                  }
40447                  case 0x01200000: {
40448                    // 0xf3200e10
40449                    unsigned rd = ExtractDRegister(instr, 22, 12);
40450                    unsigned rn = ExtractDRegister(instr, 7, 16);
40451                    unsigned rm = ExtractDRegister(instr, 5, 0);
40452                    // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40453                    vacgt(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40454                    break;
40455                  }
40456                  default:
40457                    UnallocatedA32(instr);
40458                    break;
40459                }
40460                break;
40461              }
40462              case 0x00000e40: {
40463                // 0xf2000e50
40464                switch (instr & 0x01300000) {
40465                  case 0x01000000: {
40466                    // 0xf3000e50
40467                    if (((instr >> 12) & 1) != 0) {
40468                      UnallocatedA32(instr);
40469                      return;
40470                    }
40471                    unsigned rd = ExtractQRegister(instr, 22, 12);
40472                    if (((instr >> 16) & 1) != 0) {
40473                      UnallocatedA32(instr);
40474                      return;
40475                    }
40476                    unsigned rn = ExtractQRegister(instr, 7, 16);
40477                    if ((instr & 1) != 0) {
40478                      UnallocatedA32(instr);
40479                      return;
40480                    }
40481                    unsigned rm = ExtractQRegister(instr, 5, 0);
40482                    // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40483                    vacge(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40484                    break;
40485                  }
40486                  case 0x01200000: {
40487                    // 0xf3200e50
40488                    if (((instr >> 12) & 1) != 0) {
40489                      UnallocatedA32(instr);
40490                      return;
40491                    }
40492                    unsigned rd = ExtractQRegister(instr, 22, 12);
40493                    if (((instr >> 16) & 1) != 0) {
40494                      UnallocatedA32(instr);
40495                      return;
40496                    }
40497                    unsigned rn = ExtractQRegister(instr, 7, 16);
40498                    if ((instr & 1) != 0) {
40499                      UnallocatedA32(instr);
40500                      return;
40501                    }
40502                    unsigned rm = ExtractQRegister(instr, 5, 0);
40503                    // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40504                    vacgt(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40505                    break;
40506                  }
40507                  default:
40508                    UnallocatedA32(instr);
40509                    break;
40510                }
40511                break;
40512              }
40513              case 0x00000f00: {
40514                // 0xf2000f10
40515                switch (instr & 0x01300000) {
40516                  case 0x00000000: {
40517                    // 0xf2000f10
40518                    unsigned rd = ExtractDRegister(instr, 22, 12);
40519                    unsigned rn = ExtractDRegister(instr, 7, 16);
40520                    unsigned rm = ExtractDRegister(instr, 5, 0);
40521                    // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40522                    vrecps(al,
40523                           F32,
40524                           DRegister(rd),
40525                           DRegister(rn),
40526                           DRegister(rm));
40527                    break;
40528                  }
40529                  case 0x00200000: {
40530                    // 0xf2200f10
40531                    unsigned rd = ExtractDRegister(instr, 22, 12);
40532                    unsigned rn = ExtractDRegister(instr, 7, 16);
40533                    unsigned rm = ExtractDRegister(instr, 5, 0);
40534                    // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40535                    vrsqrts(al,
40536                            F32,
40537                            DRegister(rd),
40538                            DRegister(rn),
40539                            DRegister(rm));
40540                    break;
40541                  }
40542                  case 0x01000000: {
40543                    // 0xf3000f10
40544                    unsigned rd = ExtractDRegister(instr, 22, 12);
40545                    unsigned rn = ExtractDRegister(instr, 7, 16);
40546                    unsigned rm = ExtractDRegister(instr, 5, 0);
40547                    // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40548                    vmaxnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
40549                    break;
40550                  }
40551                  case 0x01200000: {
40552                    // 0xf3200f10
40553                    unsigned rd = ExtractDRegister(instr, 22, 12);
40554                    unsigned rn = ExtractDRegister(instr, 7, 16);
40555                    unsigned rm = ExtractDRegister(instr, 5, 0);
40556                    // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40557                    vminnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
40558                    break;
40559                  }
40560                  default:
40561                    UnallocatedA32(instr);
40562                    break;
40563                }
40564                break;
40565              }
40566              case 0x00000f40: {
40567                // 0xf2000f50
40568                switch (instr & 0x01300000) {
40569                  case 0x00000000: {
40570                    // 0xf2000f50
40571                    if (((instr >> 12) & 1) != 0) {
40572                      UnallocatedA32(instr);
40573                      return;
40574                    }
40575                    unsigned rd = ExtractQRegister(instr, 22, 12);
40576                    if (((instr >> 16) & 1) != 0) {
40577                      UnallocatedA32(instr);
40578                      return;
40579                    }
40580                    unsigned rn = ExtractQRegister(instr, 7, 16);
40581                    if ((instr & 1) != 0) {
40582                      UnallocatedA32(instr);
40583                      return;
40584                    }
40585                    unsigned rm = ExtractQRegister(instr, 5, 0);
40586                    // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40587                    vrecps(al,
40588                           F32,
40589                           QRegister(rd),
40590                           QRegister(rn),
40591                           QRegister(rm));
40592                    break;
40593                  }
40594                  case 0x00200000: {
40595                    // 0xf2200f50
40596                    if (((instr >> 12) & 1) != 0) {
40597                      UnallocatedA32(instr);
40598                      return;
40599                    }
40600                    unsigned rd = ExtractQRegister(instr, 22, 12);
40601                    if (((instr >> 16) & 1) != 0) {
40602                      UnallocatedA32(instr);
40603                      return;
40604                    }
40605                    unsigned rn = ExtractQRegister(instr, 7, 16);
40606                    if ((instr & 1) != 0) {
40607                      UnallocatedA32(instr);
40608                      return;
40609                    }
40610                    unsigned rm = ExtractQRegister(instr, 5, 0);
40611                    // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40612                    vrsqrts(al,
40613                            F32,
40614                            QRegister(rd),
40615                            QRegister(rn),
40616                            QRegister(rm));
40617                    break;
40618                  }
40619                  case 0x01000000: {
40620                    // 0xf3000f50
40621                    if (((instr >> 12) & 1) != 0) {
40622                      UnallocatedA32(instr);
40623                      return;
40624                    }
40625                    unsigned rd = ExtractQRegister(instr, 22, 12);
40626                    if (((instr >> 16) & 1) != 0) {
40627                      UnallocatedA32(instr);
40628                      return;
40629                    }
40630                    unsigned rn = ExtractQRegister(instr, 7, 16);
40631                    if ((instr & 1) != 0) {
40632                      UnallocatedA32(instr);
40633                      return;
40634                    }
40635                    unsigned rm = ExtractQRegister(instr, 5, 0);
40636                    // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40637                    vmaxnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
40638                    break;
40639                  }
40640                  case 0x01200000: {
40641                    // 0xf3200f50
40642                    if (((instr >> 12) & 1) != 0) {
40643                      UnallocatedA32(instr);
40644                      return;
40645                    }
40646                    unsigned rd = ExtractQRegister(instr, 22, 12);
40647                    if (((instr >> 16) & 1) != 0) {
40648                      UnallocatedA32(instr);
40649                      return;
40650                    }
40651                    unsigned rn = ExtractQRegister(instr, 7, 16);
40652                    if ((instr & 1) != 0) {
40653                      UnallocatedA32(instr);
40654                      return;
40655                    }
40656                    unsigned rm = ExtractQRegister(instr, 5, 0);
40657                    // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40658                    vminnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
40659                    break;
40660                  }
40661                  default:
40662                    UnallocatedA32(instr);
40663                    break;
40664                }
40665                break;
40666              }
40667              default:
40668                UnallocatedA32(instr);
40669                break;
40670            }
40671            break;
40672          }
40673          case 0x00800000: {
40674            // 0xf2800000
40675            switch (instr & 0x00300000) {
40676              case 0x00300000: {
40677                // 0xf2b00000
40678                switch (instr & 0x01000000) {
40679                  case 0x00000000: {
40680                    // 0xf2b00000
40681                    switch (instr & 0x00000040) {
40682                      case 0x00000000: {
40683                        // 0xf2b00000
40684                        if (((instr & 0x800) == 0x800)) {
40685                          UnallocatedA32(instr);
40686                          return;
40687                        }
40688                        unsigned rd = ExtractDRegister(instr, 22, 12);
40689                        unsigned rn = ExtractDRegister(instr, 7, 16);
40690                        unsigned rm = ExtractDRegister(instr, 5, 0);
40691                        uint32_t imm = (instr >> 8) & 0xf;
40692                        // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; A1
40693                        vext(al,
40694                             Untyped8,
40695                             DRegister(rd),
40696                             DRegister(rn),
40697                             DRegister(rm),
40698                             imm);
40699                        break;
40700                      }
40701                      case 0x00000040: {
40702                        // 0xf2b00040
40703                        if (((instr >> 12) & 1) != 0) {
40704                          UnallocatedA32(instr);
40705                          return;
40706                        }
40707                        unsigned rd = ExtractQRegister(instr, 22, 12);
40708                        if (((instr >> 16) & 1) != 0) {
40709                          UnallocatedA32(instr);
40710                          return;
40711                        }
40712                        unsigned rn = ExtractQRegister(instr, 7, 16);
40713                        if ((instr & 1) != 0) {
40714                          UnallocatedA32(instr);
40715                          return;
40716                        }
40717                        unsigned rm = ExtractQRegister(instr, 5, 0);
40718                        uint32_t imm = (instr >> 8) & 0xf;
40719                        // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; A1
40720                        vext(al,
40721                             Untyped8,
40722                             QRegister(rd),
40723                             QRegister(rn),
40724                             QRegister(rm),
40725                             imm);
40726                        break;
40727                      }
40728                    }
40729                    break;
40730                  }
40731                  case 0x01000000: {
40732                    // 0xf3b00000
40733                    switch (instr & 0x00000800) {
40734                      case 0x00000000: {
40735                        // 0xf3b00000
40736                        switch (instr & 0x00030200) {
40737                          case 0x00000000: {
40738                            // 0xf3b00000
40739                            switch (instr & 0x000005c0) {
40740                              case 0x00000000: {
40741                                // 0xf3b00000
40742                                DataType dt =
40743                                    Dt_size_7_Decode((instr >> 18) & 0x3);
40744                                if (dt.Is(kDataTypeValueInvalid)) {
40745                                  UnallocatedA32(instr);
40746                                  return;
40747                                }
40748                                unsigned rd = ExtractDRegister(instr, 22, 12);
40749                                unsigned rm = ExtractDRegister(instr, 5, 0);
40750                                // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40751                                vrev64(al, dt, DRegister(rd), DRegister(rm));
40752                                break;
40753                              }
40754                              case 0x00000040: {
40755                                // 0xf3b00040
40756                                DataType dt =
40757                                    Dt_size_7_Decode((instr >> 18) & 0x3);
40758                                if (dt.Is(kDataTypeValueInvalid)) {
40759                                  UnallocatedA32(instr);
40760                                  return;
40761                                }
40762                                if (((instr >> 12) & 1) != 0) {
40763                                  UnallocatedA32(instr);
40764                                  return;
40765                                }
40766                                unsigned rd = ExtractQRegister(instr, 22, 12);
40767                                if ((instr & 1) != 0) {
40768                                  UnallocatedA32(instr);
40769                                  return;
40770                                }
40771                                unsigned rm = ExtractQRegister(instr, 5, 0);
40772                                // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40773                                vrev64(al, dt, QRegister(rd), QRegister(rm));
40774                                break;
40775                              }
40776                              case 0x00000080: {
40777                                // 0xf3b00080
40778                                DataType dt =
40779                                    Dt_size_15_Decode((instr >> 18) & 0x3);
40780                                if (dt.Is(kDataTypeValueInvalid)) {
40781                                  UnallocatedA32(instr);
40782                                  return;
40783                                }
40784                                unsigned rd = ExtractDRegister(instr, 22, 12);
40785                                unsigned rm = ExtractDRegister(instr, 5, 0);
40786                                // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40787                                vrev32(al, dt, DRegister(rd), DRegister(rm));
40788                                break;
40789                              }
40790                              case 0x000000c0: {
40791                                // 0xf3b000c0
40792                                DataType dt =
40793                                    Dt_size_15_Decode((instr >> 18) & 0x3);
40794                                if (dt.Is(kDataTypeValueInvalid)) {
40795                                  UnallocatedA32(instr);
40796                                  return;
40797                                }
40798                                if (((instr >> 12) & 1) != 0) {
40799                                  UnallocatedA32(instr);
40800                                  return;
40801                                }
40802                                unsigned rd = ExtractQRegister(instr, 22, 12);
40803                                if ((instr & 1) != 0) {
40804                                  UnallocatedA32(instr);
40805                                  return;
40806                                }
40807                                unsigned rm = ExtractQRegister(instr, 5, 0);
40808                                // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40809                                vrev32(al, dt, QRegister(rd), QRegister(rm));
40810                                break;
40811                              }
40812                              case 0x00000100: {
40813                                // 0xf3b00100
40814                                DataType dt =
40815                                    Dt_size_1_Decode((instr >> 18) & 0x3);
40816                                if (dt.Is(kDataTypeValueInvalid)) {
40817                                  UnallocatedA32(instr);
40818                                  return;
40819                                }
40820                                unsigned rd = ExtractDRegister(instr, 22, 12);
40821                                unsigned rm = ExtractDRegister(instr, 5, 0);
40822                                // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40823                                vrev16(al, dt, DRegister(rd), DRegister(rm));
40824                                break;
40825                              }
40826                              case 0x00000140: {
40827                                // 0xf3b00140
40828                                DataType dt =
40829                                    Dt_size_1_Decode((instr >> 18) & 0x3);
40830                                if (dt.Is(kDataTypeValueInvalid)) {
40831                                  UnallocatedA32(instr);
40832                                  return;
40833                                }
40834                                if (((instr >> 12) & 1) != 0) {
40835                                  UnallocatedA32(instr);
40836                                  return;
40837                                }
40838                                unsigned rd = ExtractQRegister(instr, 22, 12);
40839                                if ((instr & 1) != 0) {
40840                                  UnallocatedA32(instr);
40841                                  return;
40842                                }
40843                                unsigned rm = ExtractQRegister(instr, 5, 0);
40844                                // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40845                                vrev16(al, dt, QRegister(rd), QRegister(rm));
40846                                break;
40847                              }
40848                              case 0x00000400: {
40849                                // 0xf3b00400
40850                                DataType dt =
40851                                    Dt_size_5_Decode((instr >> 18) & 0x3);
40852                                if (dt.Is(kDataTypeValueInvalid)) {
40853                                  UnallocatedA32(instr);
40854                                  return;
40855                                }
40856                                unsigned rd = ExtractDRegister(instr, 22, 12);
40857                                unsigned rm = ExtractDRegister(instr, 5, 0);
40858                                // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40859                                vcls(al, dt, DRegister(rd), DRegister(rm));
40860                                break;
40861                              }
40862                              case 0x00000440: {
40863                                // 0xf3b00440
40864                                DataType dt =
40865                                    Dt_size_5_Decode((instr >> 18) & 0x3);
40866                                if (dt.Is(kDataTypeValueInvalid)) {
40867                                  UnallocatedA32(instr);
40868                                  return;
40869                                }
40870                                if (((instr >> 12) & 1) != 0) {
40871                                  UnallocatedA32(instr);
40872                                  return;
40873                                }
40874                                unsigned rd = ExtractQRegister(instr, 22, 12);
40875                                if ((instr & 1) != 0) {
40876                                  UnallocatedA32(instr);
40877                                  return;
40878                                }
40879                                unsigned rm = ExtractQRegister(instr, 5, 0);
40880                                // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40881                                vcls(al, dt, QRegister(rd), QRegister(rm));
40882                                break;
40883                              }
40884                              case 0x00000480: {
40885                                // 0xf3b00480
40886                                DataType dt =
40887                                    Dt_size_4_Decode((instr >> 18) & 0x3);
40888                                if (dt.Is(kDataTypeValueInvalid)) {
40889                                  UnallocatedA32(instr);
40890                                  return;
40891                                }
40892                                unsigned rd = ExtractDRegister(instr, 22, 12);
40893                                unsigned rm = ExtractDRegister(instr, 5, 0);
40894                                // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
40895                                vclz(al, dt, DRegister(rd), DRegister(rm));
40896                                break;
40897                              }
40898                              case 0x000004c0: {
40899                                // 0xf3b004c0
40900                                DataType dt =
40901                                    Dt_size_4_Decode((instr >> 18) & 0x3);
40902                                if (dt.Is(kDataTypeValueInvalid)) {
40903                                  UnallocatedA32(instr);
40904                                  return;
40905                                }
40906                                if (((instr >> 12) & 1) != 0) {
40907                                  UnallocatedA32(instr);
40908                                  return;
40909                                }
40910                                unsigned rd = ExtractQRegister(instr, 22, 12);
40911                                if ((instr & 1) != 0) {
40912                                  UnallocatedA32(instr);
40913                                  return;
40914                                }
40915                                unsigned rm = ExtractQRegister(instr, 5, 0);
40916                                // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
40917                                vclz(al, dt, QRegister(rd), QRegister(rm));
40918                                break;
40919                              }
40920                              case 0x00000500: {
40921                                // 0xf3b00500
40922                                if ((instr & 0x000c0000) == 0x00000000) {
40923                                  unsigned rd = ExtractDRegister(instr, 22, 12);
40924                                  unsigned rm = ExtractDRegister(instr, 5, 0);
40925                                  // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; A1
40926                                  vcnt(al,
40927                                       Untyped8,
40928                                       DRegister(rd),
40929                                       DRegister(rm));
40930                                } else {
40931                                  UnallocatedA32(instr);
40932                                }
40933                                break;
40934                              }
40935                              case 0x00000540: {
40936                                // 0xf3b00540
40937                                if ((instr & 0x000c0000) == 0x00000000) {
40938                                  if (((instr >> 12) & 1) != 0) {
40939                                    UnallocatedA32(instr);
40940                                    return;
40941                                  }
40942                                  unsigned rd = ExtractQRegister(instr, 22, 12);
40943                                  if ((instr & 1) != 0) {
40944                                    UnallocatedA32(instr);
40945                                    return;
40946                                  }
40947                                  unsigned rm = ExtractQRegister(instr, 5, 0);
40948                                  // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; A1
40949                                  vcnt(al,
40950                                       Untyped8,
40951                                       QRegister(rd),
40952                                       QRegister(rm));
40953                                } else {
40954                                  UnallocatedA32(instr);
40955                                }
40956                                break;
40957                              }
40958                              case 0x00000580: {
40959                                // 0xf3b00580
40960                                if ((instr & 0x000c0000) == 0x00000000) {
40961                                  unsigned rd = ExtractDRegister(instr, 22, 12);
40962                                  unsigned rm = ExtractDRegister(instr, 5, 0);
40963                                  // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
40964                                  vmvn(al,
40965                                       kDataTypeValueNone,
40966                                       DRegister(rd),
40967                                       DRegister(rm));
40968                                } else {
40969                                  UnallocatedA32(instr);
40970                                }
40971                                break;
40972                              }
40973                              case 0x000005c0: {
40974                                // 0xf3b005c0
40975                                if ((instr & 0x000c0000) == 0x00000000) {
40976                                  if (((instr >> 12) & 1) != 0) {
40977                                    UnallocatedA32(instr);
40978                                    return;
40979                                  }
40980                                  unsigned rd = ExtractQRegister(instr, 22, 12);
40981                                  if ((instr & 1) != 0) {
40982                                    UnallocatedA32(instr);
40983                                    return;
40984                                  }
40985                                  unsigned rm = ExtractQRegister(instr, 5, 0);
40986                                  // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
40987                                  vmvn(al,
40988                                       kDataTypeValueNone,
40989                                       QRegister(rd),
40990                                       QRegister(rm));
40991                                } else {
40992                                  UnallocatedA32(instr);
40993                                }
40994                                break;
40995                              }
40996                              default:
40997                                UnallocatedA32(instr);
40998                                break;
40999                            }
41000                            break;
41001                          }
41002                          case 0x00000200: {
41003                            // 0xf3b00200
41004                            switch (instr & 0x00000540) {
41005                              case 0x00000000: {
41006                                // 0xf3b00200
41007                                DataType dt =
41008                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41009                                                        ((instr >> 5) & 0x4));
41010                                if (dt.Is(kDataTypeValueInvalid)) {
41011                                  UnallocatedA32(instr);
41012                                  return;
41013                                }
41014                                unsigned rd = ExtractDRegister(instr, 22, 12);
41015                                unsigned rm = ExtractDRegister(instr, 5, 0);
41016                                // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41017                                vpaddl(al, dt, DRegister(rd), DRegister(rm));
41018                                break;
41019                              }
41020                              case 0x00000040: {
41021                                // 0xf3b00240
41022                                DataType dt =
41023                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41024                                                        ((instr >> 5) & 0x4));
41025                                if (dt.Is(kDataTypeValueInvalid)) {
41026                                  UnallocatedA32(instr);
41027                                  return;
41028                                }
41029                                if (((instr >> 12) & 1) != 0) {
41030                                  UnallocatedA32(instr);
41031                                  return;
41032                                }
41033                                unsigned rd = ExtractQRegister(instr, 22, 12);
41034                                if ((instr & 1) != 0) {
41035                                  UnallocatedA32(instr);
41036                                  return;
41037                                }
41038                                unsigned rm = ExtractQRegister(instr, 5, 0);
41039                                // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41040                                vpaddl(al, dt, QRegister(rd), QRegister(rm));
41041                                break;
41042                              }
41043                              case 0x00000100: {
41044                                // 0xf3b00300
41045                                switch (instr & 0x00000080) {
41046                                  case 0x00000000: {
41047                                    // 0xf3b00300
41048                                    UnimplementedA32("AESE", instr);
41049                                    break;
41050                                  }
41051                                  case 0x00000080: {
41052                                    // 0xf3b00380
41053                                    UnimplementedA32("AESMC", instr);
41054                                    break;
41055                                  }
41056                                }
41057                                break;
41058                              }
41059                              case 0x00000140: {
41060                                // 0xf3b00340
41061                                switch (instr & 0x00000080) {
41062                                  case 0x00000000: {
41063                                    // 0xf3b00340
41064                                    UnimplementedA32("AESD", instr);
41065                                    break;
41066                                  }
41067                                  case 0x00000080: {
41068                                    // 0xf3b003c0
41069                                    UnimplementedA32("AESIMC", instr);
41070                                    break;
41071                                  }
41072                                }
41073                                break;
41074                              }
41075                              case 0x00000400: {
41076                                // 0xf3b00600
41077                                DataType dt =
41078                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41079                                                        ((instr >> 5) & 0x4));
41080                                if (dt.Is(kDataTypeValueInvalid)) {
41081                                  UnallocatedA32(instr);
41082                                  return;
41083                                }
41084                                unsigned rd = ExtractDRegister(instr, 22, 12);
41085                                unsigned rm = ExtractDRegister(instr, 5, 0);
41086                                // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41087                                vpadal(al, dt, DRegister(rd), DRegister(rm));
41088                                break;
41089                              }
41090                              case 0x00000440: {
41091                                // 0xf3b00640
41092                                DataType dt =
41093                                    Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41094                                                        ((instr >> 5) & 0x4));
41095                                if (dt.Is(kDataTypeValueInvalid)) {
41096                                  UnallocatedA32(instr);
41097                                  return;
41098                                }
41099                                if (((instr >> 12) & 1) != 0) {
41100                                  UnallocatedA32(instr);
41101                                  return;
41102                                }
41103                                unsigned rd = ExtractQRegister(instr, 22, 12);
41104                                if ((instr & 1) != 0) {
41105                                  UnallocatedA32(instr);
41106                                  return;
41107                                }
41108                                unsigned rm = ExtractQRegister(instr, 5, 0);
41109                                // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41110                                vpadal(al, dt, QRegister(rd), QRegister(rm));
41111                                break;
41112                              }
41113                              case 0x00000500: {
41114                                // 0xf3b00700
41115                                switch (instr & 0x00000080) {
41116                                  case 0x00000000: {
41117                                    // 0xf3b00700
41118                                    DataType dt =
41119                                        Dt_size_5_Decode((instr >> 18) & 0x3);
41120                                    if (dt.Is(kDataTypeValueInvalid)) {
41121                                      UnallocatedA32(instr);
41122                                      return;
41123                                    }
41124                                    unsigned rd =
41125                                        ExtractDRegister(instr, 22, 12);
41126                                    unsigned rm = ExtractDRegister(instr, 5, 0);
41127                                    // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41128                                    vqabs(al, dt, DRegister(rd), DRegister(rm));
41129                                    break;
41130                                  }
41131                                  case 0x00000080: {
41132                                    // 0xf3b00780
41133                                    DataType dt =
41134                                        Dt_size_5_Decode((instr >> 18) & 0x3);
41135                                    if (dt.Is(kDataTypeValueInvalid)) {
41136                                      UnallocatedA32(instr);
41137                                      return;
41138                                    }
41139                                    unsigned rd =
41140                                        ExtractDRegister(instr, 22, 12);
41141                                    unsigned rm = ExtractDRegister(instr, 5, 0);
41142                                    // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41143                                    vqneg(al, dt, DRegister(rd), DRegister(rm));
41144                                    break;
41145                                  }
41146                                }
41147                                break;
41148                              }
41149                              case 0x00000540: {
41150                                // 0xf3b00740
41151                                switch (instr & 0x00000080) {
41152                                  case 0x00000000: {
41153                                    // 0xf3b00740
41154                                    DataType dt =
41155                                        Dt_size_5_Decode((instr >> 18) & 0x3);
41156                                    if (dt.Is(kDataTypeValueInvalid)) {
41157                                      UnallocatedA32(instr);
41158                                      return;
41159                                    }
41160                                    if (((instr >> 12) & 1) != 0) {
41161                                      UnallocatedA32(instr);
41162                                      return;
41163                                    }
41164                                    unsigned rd =
41165                                        ExtractQRegister(instr, 22, 12);
41166                                    if ((instr & 1) != 0) {
41167                                      UnallocatedA32(instr);
41168                                      return;
41169                                    }
41170                                    unsigned rm = ExtractQRegister(instr, 5, 0);
41171                                    // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41172                                    vqabs(al, dt, QRegister(rd), QRegister(rm));
41173                                    break;
41174                                  }
41175                                  case 0x00000080: {
41176                                    // 0xf3b007c0
41177                                    DataType dt =
41178                                        Dt_size_5_Decode((instr >> 18) & 0x3);
41179                                    if (dt.Is(kDataTypeValueInvalid)) {
41180                                      UnallocatedA32(instr);
41181                                      return;
41182                                    }
41183                                    if (((instr >> 12) & 1) != 0) {
41184                                      UnallocatedA32(instr);
41185                                      return;
41186                                    }
41187                                    unsigned rd =
41188                                        ExtractQRegister(instr, 22, 12);
41189                                    if ((instr & 1) != 0) {
41190                                      UnallocatedA32(instr);
41191                                      return;
41192                                    }
41193                                    unsigned rm = ExtractQRegister(instr, 5, 0);
41194                                    // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41195                                    vqneg(al, dt, QRegister(rd), QRegister(rm));
41196                                    break;
41197                                  }
41198                                }
41199                                break;
41200                              }
41201                            }
41202                            break;
41203                          }
41204                          case 0x00010000: {
41205                            // 0xf3b10000
41206                            switch (instr & 0x000001c0) {
41207                              case 0x00000000: {
41208                                // 0xf3b10000
41209                                DataType dt =
41210                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41211                                                       ((instr >> 8) & 0x4));
41212                                if (dt.Is(kDataTypeValueInvalid)) {
41213                                  UnallocatedA32(instr);
41214                                  return;
41215                                }
41216                                unsigned rd = ExtractDRegister(instr, 22, 12);
41217                                unsigned rm = ExtractDRegister(instr, 5, 0);
41218                                // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41219                                vcgt(al,
41220                                     dt,
41221                                     DRegister(rd),
41222                                     DRegister(rm),
41223                                     UINT32_C(0));
41224                                break;
41225                              }
41226                              case 0x00000040: {
41227                                // 0xf3b10040
41228                                DataType dt =
41229                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41230                                                       ((instr >> 8) & 0x4));
41231                                if (dt.Is(kDataTypeValueInvalid)) {
41232                                  UnallocatedA32(instr);
41233                                  return;
41234                                }
41235                                if (((instr >> 12) & 1) != 0) {
41236                                  UnallocatedA32(instr);
41237                                  return;
41238                                }
41239                                unsigned rd = ExtractQRegister(instr, 22, 12);
41240                                if ((instr & 1) != 0) {
41241                                  UnallocatedA32(instr);
41242                                  return;
41243                                }
41244                                unsigned rm = ExtractQRegister(instr, 5, 0);
41245                                // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41246                                vcgt(al,
41247                                     dt,
41248                                     QRegister(rd),
41249                                     QRegister(rm),
41250                                     UINT32_C(0));
41251                                break;
41252                              }
41253                              case 0x00000080: {
41254                                // 0xf3b10080
41255                                DataType dt =
41256                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41257                                                       ((instr >> 8) & 0x4));
41258                                if (dt.Is(kDataTypeValueInvalid)) {
41259                                  UnallocatedA32(instr);
41260                                  return;
41261                                }
41262                                unsigned rd = ExtractDRegister(instr, 22, 12);
41263                                unsigned rm = ExtractDRegister(instr, 5, 0);
41264                                // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41265                                vcge(al,
41266                                     dt,
41267                                     DRegister(rd),
41268                                     DRegister(rm),
41269                                     UINT32_C(0));
41270                                break;
41271                              }
41272                              case 0x000000c0: {
41273                                // 0xf3b100c0
41274                                DataType dt =
41275                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41276                                                       ((instr >> 8) & 0x4));
41277                                if (dt.Is(kDataTypeValueInvalid)) {
41278                                  UnallocatedA32(instr);
41279                                  return;
41280                                }
41281                                if (((instr >> 12) & 1) != 0) {
41282                                  UnallocatedA32(instr);
41283                                  return;
41284                                }
41285                                unsigned rd = ExtractQRegister(instr, 22, 12);
41286                                if ((instr & 1) != 0) {
41287                                  UnallocatedA32(instr);
41288                                  return;
41289                                }
41290                                unsigned rm = ExtractQRegister(instr, 5, 0);
41291                                // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41292                                vcge(al,
41293                                     dt,
41294                                     QRegister(rd),
41295                                     QRegister(rm),
41296                                     UINT32_C(0));
41297                                break;
41298                              }
41299                              case 0x00000100: {
41300                                // 0xf3b10100
41301                                DataType dt =
41302                                    Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
41303                                                       ((instr >> 8) & 0x4));
41304                                if (dt.Is(kDataTypeValueInvalid)) {
41305                                  UnallocatedA32(instr);
41306                                  return;
41307                                }
41308                                unsigned rd = ExtractDRegister(instr, 22, 12);
41309                                unsigned rm = ExtractDRegister(instr, 5, 0);
41310                                // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41311                                vceq(al,
41312                                     dt,
41313                                     DRegister(rd),
41314                                     DRegister(rm),
41315                                     UINT32_C(0));
41316                                break;
41317                              }
41318                              case 0x00000140: {
41319                                // 0xf3b10140
41320                                DataType dt =
41321                                    Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
41322                                                       ((instr >> 8) & 0x4));
41323                                if (dt.Is(kDataTypeValueInvalid)) {
41324                                  UnallocatedA32(instr);
41325                                  return;
41326                                }
41327                                if (((instr >> 12) & 1) != 0) {
41328                                  UnallocatedA32(instr);
41329                                  return;
41330                                }
41331                                unsigned rd = ExtractQRegister(instr, 22, 12);
41332                                if ((instr & 1) != 0) {
41333                                  UnallocatedA32(instr);
41334                                  return;
41335                                }
41336                                unsigned rm = ExtractQRegister(instr, 5, 0);
41337                                // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41338                                vceq(al,
41339                                     dt,
41340                                     QRegister(rd),
41341                                     QRegister(rm),
41342                                     UINT32_C(0));
41343                                break;
41344                              }
41345                              case 0x00000180: {
41346                                // 0xf3b10180
41347                                DataType dt =
41348                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41349                                                       ((instr >> 8) & 0x4));
41350                                if (dt.Is(kDataTypeValueInvalid)) {
41351                                  UnallocatedA32(instr);
41352                                  return;
41353                                }
41354                                unsigned rd = ExtractDRegister(instr, 22, 12);
41355                                unsigned rm = ExtractDRegister(instr, 5, 0);
41356                                // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41357                                vcle(al,
41358                                     dt,
41359                                     DRegister(rd),
41360                                     DRegister(rm),
41361                                     UINT32_C(0));
41362                                break;
41363                              }
41364                              case 0x000001c0: {
41365                                // 0xf3b101c0
41366                                DataType dt =
41367                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41368                                                       ((instr >> 8) & 0x4));
41369                                if (dt.Is(kDataTypeValueInvalid)) {
41370                                  UnallocatedA32(instr);
41371                                  return;
41372                                }
41373                                if (((instr >> 12) & 1) != 0) {
41374                                  UnallocatedA32(instr);
41375                                  return;
41376                                }
41377                                unsigned rd = ExtractQRegister(instr, 22, 12);
41378                                if ((instr & 1) != 0) {
41379                                  UnallocatedA32(instr);
41380                                  return;
41381                                }
41382                                unsigned rm = ExtractQRegister(instr, 5, 0);
41383                                // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41384                                vcle(al,
41385                                     dt,
41386                                     QRegister(rd),
41387                                     QRegister(rm),
41388                                     UINT32_C(0));
41389                                break;
41390                              }
41391                            }
41392                            break;
41393                          }
41394                          case 0x00010200: {
41395                            // 0xf3b10200
41396                            switch (instr & 0x000001c0) {
41397                              case 0x00000000: {
41398                                // 0xf3b10200
41399                                DataType dt =
41400                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41401                                                       ((instr >> 8) & 0x4));
41402                                if (dt.Is(kDataTypeValueInvalid)) {
41403                                  UnallocatedA32(instr);
41404                                  return;
41405                                }
41406                                unsigned rd = ExtractDRegister(instr, 22, 12);
41407                                unsigned rm = ExtractDRegister(instr, 5, 0);
41408                                // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41409                                vclt(al,
41410                                     dt,
41411                                     DRegister(rd),
41412                                     DRegister(rm),
41413                                     UINT32_C(0));
41414                                break;
41415                              }
41416                              case 0x00000040: {
41417                                // 0xf3b10240
41418                                DataType dt =
41419                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41420                                                       ((instr >> 8) & 0x4));
41421                                if (dt.Is(kDataTypeValueInvalid)) {
41422                                  UnallocatedA32(instr);
41423                                  return;
41424                                }
41425                                if (((instr >> 12) & 1) != 0) {
41426                                  UnallocatedA32(instr);
41427                                  return;
41428                                }
41429                                unsigned rd = ExtractQRegister(instr, 22, 12);
41430                                if ((instr & 1) != 0) {
41431                                  UnallocatedA32(instr);
41432                                  return;
41433                                }
41434                                unsigned rm = ExtractQRegister(instr, 5, 0);
41435                                // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41436                                vclt(al,
41437                                     dt,
41438                                     QRegister(rd),
41439                                     QRegister(rm),
41440                                     UINT32_C(0));
41441                                break;
41442                              }
41443                              case 0x000000c0: {
41444                                // 0xf3b102c0
41445                                if ((instr & 0x000c0400) == 0x00080000) {
41446                                  UnimplementedA32("SHA1H", instr);
41447                                } else {
41448                                  UnallocatedA32(instr);
41449                                }
41450                                break;
41451                              }
41452                              case 0x00000100: {
41453                                // 0xf3b10300
41454                                DataType dt =
41455                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41456                                                       ((instr >> 8) & 0x4));
41457                                if (dt.Is(kDataTypeValueInvalid)) {
41458                                  UnallocatedA32(instr);
41459                                  return;
41460                                }
41461                                unsigned rd = ExtractDRegister(instr, 22, 12);
41462                                unsigned rm = ExtractDRegister(instr, 5, 0);
41463                                // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41464                                vabs(al, dt, DRegister(rd), DRegister(rm));
41465                                break;
41466                              }
41467                              case 0x00000140: {
41468                                // 0xf3b10340
41469                                DataType dt =
41470                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41471                                                       ((instr >> 8) & 0x4));
41472                                if (dt.Is(kDataTypeValueInvalid)) {
41473                                  UnallocatedA32(instr);
41474                                  return;
41475                                }
41476                                if (((instr >> 12) & 1) != 0) {
41477                                  UnallocatedA32(instr);
41478                                  return;
41479                                }
41480                                unsigned rd = ExtractQRegister(instr, 22, 12);
41481                                if ((instr & 1) != 0) {
41482                                  UnallocatedA32(instr);
41483                                  return;
41484                                }
41485                                unsigned rm = ExtractQRegister(instr, 5, 0);
41486                                // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41487                                vabs(al, dt, QRegister(rd), QRegister(rm));
41488                                break;
41489                              }
41490                              case 0x00000180: {
41491                                // 0xf3b10380
41492                                DataType dt =
41493                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41494                                                       ((instr >> 8) & 0x4));
41495                                if (dt.Is(kDataTypeValueInvalid)) {
41496                                  UnallocatedA32(instr);
41497                                  return;
41498                                }
41499                                unsigned rd = ExtractDRegister(instr, 22, 12);
41500                                unsigned rm = ExtractDRegister(instr, 5, 0);
41501                                // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41502                                vneg(al, dt, DRegister(rd), DRegister(rm));
41503                                break;
41504                              }
41505                              case 0x000001c0: {
41506                                // 0xf3b103c0
41507                                DataType dt =
41508                                    Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41509                                                       ((instr >> 8) & 0x4));
41510                                if (dt.Is(kDataTypeValueInvalid)) {
41511                                  UnallocatedA32(instr);
41512                                  return;
41513                                }
41514                                if (((instr >> 12) & 1) != 0) {
41515                                  UnallocatedA32(instr);
41516                                  return;
41517                                }
41518                                unsigned rd = ExtractQRegister(instr, 22, 12);
41519                                if ((instr & 1) != 0) {
41520                                  UnallocatedA32(instr);
41521                                  return;
41522                                }
41523                                unsigned rm = ExtractQRegister(instr, 5, 0);
41524                                // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41525                                vneg(al, dt, QRegister(rd), QRegister(rm));
41526                                break;
41527                              }
41528                              default:
41529                                UnallocatedA32(instr);
41530                                break;
41531                            }
41532                            break;
41533                          }
41534                          case 0x00020000: {
41535                            // 0xf3b20000
41536                            switch (instr & 0x000005c0) {
41537                              case 0x00000000: {
41538                                // 0xf3b20000
41539                                if ((instr & 0x000c0000) == 0x00000000) {
41540                                  unsigned rd = ExtractDRegister(instr, 22, 12);
41541                                  unsigned rm = ExtractDRegister(instr, 5, 0);
41542                                  // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
41543                                  vswp(al,
41544                                       kDataTypeValueNone,
41545                                       DRegister(rd),
41546                                       DRegister(rm));
41547                                } else {
41548                                  UnallocatedA32(instr);
41549                                }
41550                                break;
41551                              }
41552                              case 0x00000040: {
41553                                // 0xf3b20040
41554                                if ((instr & 0x000c0000) == 0x00000000) {
41555                                  if (((instr >> 12) & 1) != 0) {
41556                                    UnallocatedA32(instr);
41557                                    return;
41558                                  }
41559                                  unsigned rd = ExtractQRegister(instr, 22, 12);
41560                                  if ((instr & 1) != 0) {
41561                                    UnallocatedA32(instr);
41562                                    return;
41563                                  }
41564                                  unsigned rm = ExtractQRegister(instr, 5, 0);
41565                                  // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
41566                                  vswp(al,
41567                                       kDataTypeValueNone,
41568                                       QRegister(rd),
41569                                       QRegister(rm));
41570                                } else {
41571                                  UnallocatedA32(instr);
41572                                }
41573                                break;
41574                              }
41575                              case 0x00000080: {
41576                                // 0xf3b20080
41577                                DataType dt =
41578                                    Dt_size_7_Decode((instr >> 18) & 0x3);
41579                                if (dt.Is(kDataTypeValueInvalid)) {
41580                                  UnallocatedA32(instr);
41581                                  return;
41582                                }
41583                                unsigned rd = ExtractDRegister(instr, 22, 12);
41584                                unsigned rm = ExtractDRegister(instr, 5, 0);
41585                                // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41586                                vtrn(al, dt, DRegister(rd), DRegister(rm));
41587                                break;
41588                              }
41589                              case 0x000000c0: {
41590                                // 0xf3b200c0
41591                                DataType dt =
41592                                    Dt_size_7_Decode((instr >> 18) & 0x3);
41593                                if (dt.Is(kDataTypeValueInvalid)) {
41594                                  UnallocatedA32(instr);
41595                                  return;
41596                                }
41597                                if (((instr >> 12) & 1) != 0) {
41598                                  UnallocatedA32(instr);
41599                                  return;
41600                                }
41601                                unsigned rd = ExtractQRegister(instr, 22, 12);
41602                                if ((instr & 1) != 0) {
41603                                  UnallocatedA32(instr);
41604                                  return;
41605                                }
41606                                unsigned rm = ExtractQRegister(instr, 5, 0);
41607                                // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41608                                vtrn(al, dt, QRegister(rd), QRegister(rm));
41609                                break;
41610                              }
41611                              case 0x00000100: {
41612                                // 0xf3b20100
41613                                DataType dt =
41614                                    Dt_size_15_Decode((instr >> 18) & 0x3);
41615                                if (dt.Is(kDataTypeValueInvalid)) {
41616                                  UnallocatedA32(instr);
41617                                  return;
41618                                }
41619                                unsigned rd = ExtractDRegister(instr, 22, 12);
41620                                unsigned rm = ExtractDRegister(instr, 5, 0);
41621                                // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41622                                vuzp(al, dt, DRegister(rd), DRegister(rm));
41623                                break;
41624                              }
41625                              case 0x00000140: {
41626                                // 0xf3b20140
41627                                DataType dt =
41628                                    Dt_size_7_Decode((instr >> 18) & 0x3);
41629                                if (dt.Is(kDataTypeValueInvalid)) {
41630                                  UnallocatedA32(instr);
41631                                  return;
41632                                }
41633                                if (((instr >> 12) & 1) != 0) {
41634                                  UnallocatedA32(instr);
41635                                  return;
41636                                }
41637                                unsigned rd = ExtractQRegister(instr, 22, 12);
41638                                if ((instr & 1) != 0) {
41639                                  UnallocatedA32(instr);
41640                                  return;
41641                                }
41642                                unsigned rm = ExtractQRegister(instr, 5, 0);
41643                                // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41644                                vuzp(al, dt, QRegister(rd), QRegister(rm));
41645                                break;
41646                              }
41647                              case 0x00000180: {
41648                                // 0xf3b20180
41649                                DataType dt =
41650                                    Dt_size_15_Decode((instr >> 18) & 0x3);
41651                                if (dt.Is(kDataTypeValueInvalid)) {
41652                                  UnallocatedA32(instr);
41653                                  return;
41654                                }
41655                                unsigned rd = ExtractDRegister(instr, 22, 12);
41656                                unsigned rm = ExtractDRegister(instr, 5, 0);
41657                                // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41658                                vzip(al, dt, DRegister(rd), DRegister(rm));
41659                                break;
41660                              }
41661                              case 0x000001c0: {
41662                                // 0xf3b201c0
41663                                DataType dt =
41664                                    Dt_size_7_Decode((instr >> 18) & 0x3);
41665                                if (dt.Is(kDataTypeValueInvalid)) {
41666                                  UnallocatedA32(instr);
41667                                  return;
41668                                }
41669                                if (((instr >> 12) & 1) != 0) {
41670                                  UnallocatedA32(instr);
41671                                  return;
41672                                }
41673                                unsigned rd = ExtractQRegister(instr, 22, 12);
41674                                if ((instr & 1) != 0) {
41675                                  UnallocatedA32(instr);
41676                                  return;
41677                                }
41678                                unsigned rm = ExtractQRegister(instr, 5, 0);
41679                                // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41680                                vzip(al, dt, QRegister(rd), QRegister(rm));
41681                                break;
41682                              }
41683                              case 0x00000400: {
41684                                // 0xf3b20400
41685                                DataType dt =
41686                                    Dt_size_16_Decode((instr >> 18) & 0x3);
41687                                if (dt.Is(kDataTypeValueInvalid)) {
41688                                  UnallocatedA32(instr);
41689                                  return;
41690                                }
41691                                unsigned rd = ExtractDRegister(instr, 22, 12);
41692                                unsigned rm = ExtractDRegister(instr, 5, 0);
41693                                // VRINTN{<q>}.<dt> <Dd>, <Dm> ; A1
41694                                vrintn(dt, DRegister(rd), DRegister(rm));
41695                                break;
41696                              }
41697                              case 0x00000440: {
41698                                // 0xf3b20440
41699                                DataType dt =
41700                                    Dt_size_16_Decode((instr >> 18) & 0x3);
41701                                if (dt.Is(kDataTypeValueInvalid)) {
41702                                  UnallocatedA32(instr);
41703                                  return;
41704                                }
41705                                if (((instr >> 12) & 1) != 0) {
41706                                  UnallocatedA32(instr);
41707                                  return;
41708                                }
41709                                unsigned rd = ExtractQRegister(instr, 22, 12);
41710                                if ((instr & 1) != 0) {
41711                                  UnallocatedA32(instr);
41712                                  return;
41713                                }
41714                                unsigned rm = ExtractQRegister(instr, 5, 0);
41715                                // VRINTN{<q>}.<dt> <Qd>, <Qm> ; A1
41716                                vrintn(dt, QRegister(rd), QRegister(rm));
41717                                break;
41718                              }
41719                              case 0x00000480: {
41720                                // 0xf3b20480
41721                                DataType dt =
41722                                    Dt_size_16_Decode((instr >> 18) & 0x3);
41723                                if (dt.Is(kDataTypeValueInvalid)) {
41724                                  UnallocatedA32(instr);
41725                                  return;
41726                                }
41727                                unsigned rd = ExtractDRegister(instr, 22, 12);
41728                                unsigned rm = ExtractDRegister(instr, 5, 0);
41729                                // VRINTX{<q>}.<dt> <Dd>, <Dm> ; A1
41730                                vrintx(al, dt, DRegister(rd), DRegister(rm));
41731                                break;
41732                              }
41733                              case 0x000004c0: {
41734                                // 0xf3b204c0
41735                                DataType dt =
41736                                    Dt_size_16_Decode((instr >> 18) & 0x3);
41737                                if (dt.Is(kDataTypeValueInvalid)) {
41738                                  UnallocatedA32(instr);
41739                                  return;
41740                                }
41741                                if (((instr >> 12) & 1) != 0) {
41742                                  UnallocatedA32(instr);
41743                                  return;
41744                                }
41745                                unsigned rd = ExtractQRegister(instr, 22, 12);
41746                                if ((instr & 1) != 0) {
41747                                  UnallocatedA32(instr);
41748                                  return;
41749                                }
41750                                unsigned rm = ExtractQRegister(instr, 5, 0);
41751                                // VRINTX{<q>}.<dt> <Qd>, <Qm> ; A1
41752                                vrintx(dt, QRegister(rd), QRegister(rm));
41753                                break;
41754                              }
41755                              case 0x00000500: {
41756                                // 0xf3b20500
41757                                DataType dt =
41758                                    Dt_size_16_Decode((instr >> 18) & 0x3);
41759                                if (dt.Is(kDataTypeValueInvalid)) {
41760                                  UnallocatedA32(instr);
41761                                  return;
41762                                }
41763                                unsigned rd = ExtractDRegister(instr, 22, 12);
41764                                unsigned rm = ExtractDRegister(instr, 5, 0);
41765                                // VRINTA{<q>}.<dt> <Dd>, <Dm> ; A1
41766                                vrinta(dt, DRegister(rd), DRegister(rm));
41767                                break;
41768                              }
41769                              case 0x00000540: {
41770                                // 0xf3b20540
41771                                DataType dt =
41772                                    Dt_size_16_Decode((instr >> 18) & 0x3);
41773                                if (dt.Is(kDataTypeValueInvalid)) {
41774                                  UnallocatedA32(instr);
41775                                  return;
41776                                }
41777                                if (((instr >> 12) & 1) != 0) {
41778                                  UnallocatedA32(instr);
41779                                  return;
41780                                }
41781                                unsigned rd = ExtractQRegister(instr, 22, 12);
41782                                if ((instr & 1) != 0) {
41783                                  UnallocatedA32(instr);
41784                                  return;
41785                                }
41786                                unsigned rm = ExtractQRegister(instr, 5, 0);
41787                                // VRINTA{<q>}.<dt> <Qd>, <Qm> ; A1
41788                                vrinta(dt, QRegister(rd), QRegister(rm));
41789                                break;
41790                              }
41791                              case 0x00000580: {
41792                                // 0xf3b20580
41793                                DataType dt =
41794                                    Dt_size_16_Decode((instr >> 18) & 0x3);
41795                                if (dt.Is(kDataTypeValueInvalid)) {
41796                                  UnallocatedA32(instr);
41797                                  return;
41798                                }
41799                                unsigned rd = ExtractDRegister(instr, 22, 12);
41800                                unsigned rm = ExtractDRegister(instr, 5, 0);
41801                                // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; A1
41802                                vrintz(al, dt, DRegister(rd), DRegister(rm));
41803                                break;
41804                              }
41805                              case 0x000005c0: {
41806                                // 0xf3b205c0
41807                                DataType dt =
41808                                    Dt_size_16_Decode((instr >> 18) & 0x3);
41809                                if (dt.Is(kDataTypeValueInvalid)) {
41810                                  UnallocatedA32(instr);
41811                                  return;
41812                                }
41813                                if (((instr >> 12) & 1) != 0) {
41814                                  UnallocatedA32(instr);
41815                                  return;
41816                                }
41817                                unsigned rd = ExtractQRegister(instr, 22, 12);
41818                                if ((instr & 1) != 0) {
41819                                  UnallocatedA32(instr);
41820                                  return;
41821                                }
41822                                unsigned rm = ExtractQRegister(instr, 5, 0);
41823                                // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; A1
41824                                vrintz(dt, QRegister(rd), QRegister(rm));
41825                                break;
41826                              }
41827                            }
41828                            break;
41829                          }
41830                          case 0x00020200: {
41831                            // 0xf3b20200
41832                            switch (instr & 0x00000580) {
41833                              case 0x00000000: {
41834                                // 0xf3b20200
41835                                switch (instr & 0x00000040) {
41836                                  case 0x00000000: {
41837                                    // 0xf3b20200
41838                                    DataType dt =
41839                                        Dt_size_3_Decode((instr >> 18) & 0x3);
41840                                    if (dt.Is(kDataTypeValueInvalid)) {
41841                                      UnallocatedA32(instr);
41842                                      return;
41843                                    }
41844                                    unsigned rd =
41845                                        ExtractDRegister(instr, 22, 12);
41846                                    if ((instr & 1) != 0) {
41847                                      UnallocatedA32(instr);
41848                                      return;
41849                                    }
41850                                    unsigned rm = ExtractQRegister(instr, 5, 0);
41851                                    // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
41852                                    vmovn(al, dt, DRegister(rd), QRegister(rm));
41853                                    break;
41854                                  }
41855                                  case 0x00000040: {
41856                                    // 0xf3b20240
41857                                    DataType dt =
41858                                        Dt_size_14_Decode((instr >> 18) & 0x3);
41859                                    if (dt.Is(kDataTypeValueInvalid)) {
41860                                      UnallocatedA32(instr);
41861                                      return;
41862                                    }
41863                                    unsigned rd =
41864                                        ExtractDRegister(instr, 22, 12);
41865                                    if ((instr & 1) != 0) {
41866                                      UnallocatedA32(instr);
41867                                      return;
41868                                    }
41869                                    unsigned rm = ExtractQRegister(instr, 5, 0);
41870                                    // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
41871                                    vqmovun(al,
41872                                            dt,
41873                                            DRegister(rd),
41874                                            QRegister(rm));
41875                                    break;
41876                                  }
41877                                }
41878                                break;
41879                              }
41880                              case 0x00000080: {
41881                                // 0xf3b20280
41882                                DataType dt =
41883                                    Dt_op_size_3_Decode(((instr >> 18) & 0x3) |
41884                                                        ((instr >> 4) & 0x4));
41885                                if (dt.Is(kDataTypeValueInvalid)) {
41886                                  UnallocatedA32(instr);
41887                                  return;
41888                                }
41889                                unsigned rd = ExtractDRegister(instr, 22, 12);
41890                                if ((instr & 1) != 0) {
41891                                  UnallocatedA32(instr);
41892                                  return;
41893                                }
41894                                unsigned rm = ExtractQRegister(instr, 5, 0);
41895                                // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
41896                                vqmovn(al, dt, DRegister(rd), QRegister(rm));
41897                                break;
41898                              }
41899                              case 0x00000100: {
41900                                // 0xf3b20300
41901                                if ((instr & 0x00000040) == 0x00000000) {
41902                                  DataType dt =
41903                                      Dt_size_17_Decode((instr >> 18) & 0x3);
41904                                  if (dt.Is(kDataTypeValueInvalid)) {
41905                                    UnallocatedA32(instr);
41906                                    return;
41907                                  }
41908                                  if (((instr >> 12) & 1) != 0) {
41909                                    UnallocatedA32(instr);
41910                                    return;
41911                                  }
41912                                  unsigned rd = ExtractQRegister(instr, 22, 12);
41913                                  unsigned rm = ExtractDRegister(instr, 5, 0);
41914                                  uint32_t imm = dt.GetSize();
41915                                  // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A2 NOLINT(whitespace/line_length)
41916                                  vshll(al,
41917                                        dt,
41918                                        QRegister(rd),
41919                                        DRegister(rm),
41920                                        imm);
41921                                } else {
41922                                  UnallocatedA32(instr);
41923                                }
41924                                break;
41925                              }
41926                              case 0x00000180: {
41927                                // 0xf3b20380
41928                                switch (instr & 0x000c0040) {
41929                                  case 0x00080000: {
41930                                    // 0xf3ba0380
41931                                    UnimplementedA32("SHA1SU1", instr);
41932                                    break;
41933                                  }
41934                                  case 0x00080040: {
41935                                    // 0xf3ba03c0
41936                                    UnimplementedA32("SHA256SU0", instr);
41937                                    break;
41938                                  }
41939                                  default:
41940                                    UnallocatedA32(instr);
41941                                    break;
41942                                }
41943                                break;
41944                              }
41945                              case 0x00000400: {
41946                                // 0xf3b20600
41947                                if ((instr & 0x000c0040) == 0x00040000) {
41948                                  unsigned rd = ExtractDRegister(instr, 22, 12);
41949                                  if ((instr & 1) != 0) {
41950                                    UnallocatedA32(instr);
41951                                    return;
41952                                  }
41953                                  unsigned rm = ExtractQRegister(instr, 5, 0);
41954                                  // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; A1
41955                                  vcvt(al,
41956                                       F16,
41957                                       F32,
41958                                       DRegister(rd),
41959                                       QRegister(rm));
41960                                } else {
41961                                  UnallocatedA32(instr);
41962                                }
41963                                break;
41964                              }
41965                              case 0x00000480: {
41966                                // 0xf3b20680
41967                                switch (instr & 0x00000040) {
41968                                  case 0x00000000: {
41969                                    // 0xf3b20680
41970                                    DataType dt =
41971                                        Dt_size_16_Decode((instr >> 18) & 0x3);
41972                                    if (dt.Is(kDataTypeValueInvalid)) {
41973                                      UnallocatedA32(instr);
41974                                      return;
41975                                    }
41976                                    unsigned rd =
41977                                        ExtractDRegister(instr, 22, 12);
41978                                    unsigned rm = ExtractDRegister(instr, 5, 0);
41979                                    // VRINTM{<q>}.<dt> <Dd>, <Dm> ; A1
41980                                    vrintm(dt, DRegister(rd), DRegister(rm));
41981                                    break;
41982                                  }
41983                                  case 0x00000040: {
41984                                    // 0xf3b206c0
41985                                    DataType dt =
41986                                        Dt_size_16_Decode((instr >> 18) & 0x3);
41987                                    if (dt.Is(kDataTypeValueInvalid)) {
41988                                      UnallocatedA32(instr);
41989                                      return;
41990                                    }
41991                                    if (((instr >> 12) & 1) != 0) {
41992                                      UnallocatedA32(instr);
41993                                      return;
41994                                    }
41995                                    unsigned rd =
41996                                        ExtractQRegister(instr, 22, 12);
41997                                    if ((instr & 1) != 0) {
41998                                      UnallocatedA32(instr);
41999                                      return;
42000                                    }
42001                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42002                                    // VRINTM{<q>}.<dt> <Qd>, <Qm> ; A1
42003                                    vrintm(dt, QRegister(rd), QRegister(rm));
42004                                    break;
42005                                  }
42006                                }
42007                                break;
42008                              }
42009                              case 0x00000500: {
42010                                // 0xf3b20700
42011                                if ((instr & 0x000c0040) == 0x00040000) {
42012                                  if (((instr >> 12) & 1) != 0) {
42013                                    UnallocatedA32(instr);
42014                                    return;
42015                                  }
42016                                  unsigned rd = ExtractQRegister(instr, 22, 12);
42017                                  unsigned rm = ExtractDRegister(instr, 5, 0);
42018                                  // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; A1
42019                                  vcvt(al,
42020                                       F32,
42021                                       F16,
42022                                       QRegister(rd),
42023                                       DRegister(rm));
42024                                } else {
42025                                  UnallocatedA32(instr);
42026                                }
42027                                break;
42028                              }
42029                              case 0x00000580: {
42030                                // 0xf3b20780
42031                                switch (instr & 0x00000040) {
42032                                  case 0x00000000: {
42033                                    // 0xf3b20780
42034                                    DataType dt =
42035                                        Dt_size_16_Decode((instr >> 18) & 0x3);
42036                                    if (dt.Is(kDataTypeValueInvalid)) {
42037                                      UnallocatedA32(instr);
42038                                      return;
42039                                    }
42040                                    unsigned rd =
42041                                        ExtractDRegister(instr, 22, 12);
42042                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42043                                    // VRINTP{<q>}.<dt> <Dd>, <Dm> ; A1
42044                                    vrintp(dt, DRegister(rd), DRegister(rm));
42045                                    break;
42046                                  }
42047                                  case 0x00000040: {
42048                                    // 0xf3b207c0
42049                                    DataType dt =
42050                                        Dt_size_16_Decode((instr >> 18) & 0x3);
42051                                    if (dt.Is(kDataTypeValueInvalid)) {
42052                                      UnallocatedA32(instr);
42053                                      return;
42054                                    }
42055                                    if (((instr >> 12) & 1) != 0) {
42056                                      UnallocatedA32(instr);
42057                                      return;
42058                                    }
42059                                    unsigned rd =
42060                                        ExtractQRegister(instr, 22, 12);
42061                                    if ((instr & 1) != 0) {
42062                                      UnallocatedA32(instr);
42063                                      return;
42064                                    }
42065                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42066                                    // VRINTP{<q>}.<dt> <Qd>, <Qm> ; A1
42067                                    vrintp(dt, QRegister(rd), QRegister(rm));
42068                                    break;
42069                                  }
42070                                }
42071                                break;
42072                              }
42073                            }
42074                            break;
42075                          }
42076                          case 0x00030000: {
42077                            // 0xf3b30000
42078                            switch (instr & 0x00000440) {
42079                              case 0x00000000: {
42080                                // 0xf3b30000
42081                                switch (instr & 0x000c0100) {
42082                                  case 0x00080000: {
42083                                    // 0xf3bb0000
42084                                    DataType dt =
42085                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42086                                    if (dt.Is(kDataTypeValueInvalid)) {
42087                                      UnallocatedA32(instr);
42088                                      return;
42089                                    }
42090                                    unsigned rd =
42091                                        ExtractDRegister(instr, 22, 12);
42092                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42093                                    // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42094                                    vcvta(dt,
42095                                          F32,
42096                                          DRegister(rd),
42097                                          DRegister(rm));
42098                                    break;
42099                                  }
42100                                  case 0x00080100: {
42101                                    // 0xf3bb0100
42102                                    DataType dt =
42103                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42104                                    if (dt.Is(kDataTypeValueInvalid)) {
42105                                      UnallocatedA32(instr);
42106                                      return;
42107                                    }
42108                                    unsigned rd =
42109                                        ExtractDRegister(instr, 22, 12);
42110                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42111                                    // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42112                                    vcvtn(dt,
42113                                          F32,
42114                                          DRegister(rd),
42115                                          DRegister(rm));
42116                                    break;
42117                                  }
42118                                  default:
42119                                    UnallocatedA32(instr);
42120                                    break;
42121                                }
42122                                break;
42123                              }
42124                              case 0x00000040: {
42125                                // 0xf3b30040
42126                                switch (instr & 0x000c0100) {
42127                                  case 0x00080000: {
42128                                    // 0xf3bb0040
42129                                    DataType dt =
42130                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42131                                    if (dt.Is(kDataTypeValueInvalid)) {
42132                                      UnallocatedA32(instr);
42133                                      return;
42134                                    }
42135                                    if (((instr >> 12) & 1) != 0) {
42136                                      UnallocatedA32(instr);
42137                                      return;
42138                                    }
42139                                    unsigned rd =
42140                                        ExtractQRegister(instr, 22, 12);
42141                                    if ((instr & 1) != 0) {
42142                                      UnallocatedA32(instr);
42143                                      return;
42144                                    }
42145                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42146                                    // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42147                                    vcvta(dt,
42148                                          F32,
42149                                          QRegister(rd),
42150                                          QRegister(rm));
42151                                    break;
42152                                  }
42153                                  case 0x00080100: {
42154                                    // 0xf3bb0140
42155                                    DataType dt =
42156                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42157                                    if (dt.Is(kDataTypeValueInvalid)) {
42158                                      UnallocatedA32(instr);
42159                                      return;
42160                                    }
42161                                    if (((instr >> 12) & 1) != 0) {
42162                                      UnallocatedA32(instr);
42163                                      return;
42164                                    }
42165                                    unsigned rd =
42166                                        ExtractQRegister(instr, 22, 12);
42167                                    if ((instr & 1) != 0) {
42168                                      UnallocatedA32(instr);
42169                                      return;
42170                                    }
42171                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42172                                    // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42173                                    vcvtn(dt,
42174                                          F32,
42175                                          QRegister(rd),
42176                                          QRegister(rm));
42177                                    break;
42178                                  }
42179                                  default:
42180                                    UnallocatedA32(instr);
42181                                    break;
42182                                }
42183                                break;
42184                              }
42185                              case 0x00000400: {
42186                                // 0xf3b30400
42187                                switch (instr & 0x00000080) {
42188                                  case 0x00000000: {
42189                                    // 0xf3b30400
42190                                    DataType dt = Dt_F_size_4_Decode(
42191                                        ((instr >> 18) & 0x3) |
42192                                        ((instr >> 6) & 0x4));
42193                                    if (dt.Is(kDataTypeValueInvalid)) {
42194                                      UnallocatedA32(instr);
42195                                      return;
42196                                    }
42197                                    unsigned rd =
42198                                        ExtractDRegister(instr, 22, 12);
42199                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42200                                    // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42201                                    vrecpe(al,
42202                                           dt,
42203                                           DRegister(rd),
42204                                           DRegister(rm));
42205                                    break;
42206                                  }
42207                                  case 0x00000080: {
42208                                    // 0xf3b30480
42209                                    DataType dt = Dt_F_size_4_Decode(
42210                                        ((instr >> 18) & 0x3) |
42211                                        ((instr >> 6) & 0x4));
42212                                    if (dt.Is(kDataTypeValueInvalid)) {
42213                                      UnallocatedA32(instr);
42214                                      return;
42215                                    }
42216                                    unsigned rd =
42217                                        ExtractDRegister(instr, 22, 12);
42218                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42219                                    // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42220                                    vrsqrte(al,
42221                                            dt,
42222                                            DRegister(rd),
42223                                            DRegister(rm));
42224                                    break;
42225                                  }
42226                                }
42227                                break;
42228                              }
42229                              case 0x00000440: {
42230                                // 0xf3b30440
42231                                switch (instr & 0x00000080) {
42232                                  case 0x00000000: {
42233                                    // 0xf3b30440
42234                                    DataType dt = Dt_F_size_4_Decode(
42235                                        ((instr >> 18) & 0x3) |
42236                                        ((instr >> 6) & 0x4));
42237                                    if (dt.Is(kDataTypeValueInvalid)) {
42238                                      UnallocatedA32(instr);
42239                                      return;
42240                                    }
42241                                    if (((instr >> 12) & 1) != 0) {
42242                                      UnallocatedA32(instr);
42243                                      return;
42244                                    }
42245                                    unsigned rd =
42246                                        ExtractQRegister(instr, 22, 12);
42247                                    if ((instr & 1) != 0) {
42248                                      UnallocatedA32(instr);
42249                                      return;
42250                                    }
42251                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42252                                    // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42253                                    vrecpe(al,
42254                                           dt,
42255                                           QRegister(rd),
42256                                           QRegister(rm));
42257                                    break;
42258                                  }
42259                                  case 0x00000080: {
42260                                    // 0xf3b304c0
42261                                    DataType dt = Dt_F_size_4_Decode(
42262                                        ((instr >> 18) & 0x3) |
42263                                        ((instr >> 6) & 0x4));
42264                                    if (dt.Is(kDataTypeValueInvalid)) {
42265                                      UnallocatedA32(instr);
42266                                      return;
42267                                    }
42268                                    if (((instr >> 12) & 1) != 0) {
42269                                      UnallocatedA32(instr);
42270                                      return;
42271                                    }
42272                                    unsigned rd =
42273                                        ExtractQRegister(instr, 22, 12);
42274                                    if ((instr & 1) != 0) {
42275                                      UnallocatedA32(instr);
42276                                      return;
42277                                    }
42278                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42279                                    // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42280                                    vrsqrte(al,
42281                                            dt,
42282                                            QRegister(rd),
42283                                            QRegister(rm));
42284                                    break;
42285                                  }
42286                                }
42287                                break;
42288                              }
42289                            }
42290                            break;
42291                          }
42292                          case 0x00030200: {
42293                            // 0xf3b30200
42294                            switch (instr & 0x000c0440) {
42295                              case 0x00080000: {
42296                                // 0xf3bb0200
42297                                switch (instr & 0x00000100) {
42298                                  case 0x00000000: {
42299                                    // 0xf3bb0200
42300                                    DataType dt =
42301                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42302                                    if (dt.Is(kDataTypeValueInvalid)) {
42303                                      UnallocatedA32(instr);
42304                                      return;
42305                                    }
42306                                    unsigned rd =
42307                                        ExtractDRegister(instr, 22, 12);
42308                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42309                                    // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42310                                    vcvtp(dt,
42311                                          F32,
42312                                          DRegister(rd),
42313                                          DRegister(rm));
42314                                    break;
42315                                  }
42316                                  case 0x00000100: {
42317                                    // 0xf3bb0300
42318                                    DataType dt =
42319                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42320                                    if (dt.Is(kDataTypeValueInvalid)) {
42321                                      UnallocatedA32(instr);
42322                                      return;
42323                                    }
42324                                    unsigned rd =
42325                                        ExtractDRegister(instr, 22, 12);
42326                                    unsigned rm = ExtractDRegister(instr, 5, 0);
42327                                    // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42328                                    vcvtm(dt,
42329                                          F32,
42330                                          DRegister(rd),
42331                                          DRegister(rm));
42332                                    break;
42333                                  }
42334                                }
42335                                break;
42336                              }
42337                              case 0x00080040: {
42338                                // 0xf3bb0240
42339                                switch (instr & 0x00000100) {
42340                                  case 0x00000000: {
42341                                    // 0xf3bb0240
42342                                    DataType dt =
42343                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42344                                    if (dt.Is(kDataTypeValueInvalid)) {
42345                                      UnallocatedA32(instr);
42346                                      return;
42347                                    }
42348                                    if (((instr >> 12) & 1) != 0) {
42349                                      UnallocatedA32(instr);
42350                                      return;
42351                                    }
42352                                    unsigned rd =
42353                                        ExtractQRegister(instr, 22, 12);
42354                                    if ((instr & 1) != 0) {
42355                                      UnallocatedA32(instr);
42356                                      return;
42357                                    }
42358                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42359                                    // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42360                                    vcvtp(dt,
42361                                          F32,
42362                                          QRegister(rd),
42363                                          QRegister(rm));
42364                                    break;
42365                                  }
42366                                  case 0x00000100: {
42367                                    // 0xf3bb0340
42368                                    DataType dt =
42369                                        Dt_op_3_Decode((instr >> 7) & 0x1);
42370                                    if (dt.Is(kDataTypeValueInvalid)) {
42371                                      UnallocatedA32(instr);
42372                                      return;
42373                                    }
42374                                    if (((instr >> 12) & 1) != 0) {
42375                                      UnallocatedA32(instr);
42376                                      return;
42377                                    }
42378                                    unsigned rd =
42379                                        ExtractQRegister(instr, 22, 12);
42380                                    if ((instr & 1) != 0) {
42381                                      UnallocatedA32(instr);
42382                                      return;
42383                                    }
42384                                    unsigned rm = ExtractQRegister(instr, 5, 0);
42385                                    // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42386                                    vcvtm(dt,
42387                                          F32,
42388                                          QRegister(rd),
42389                                          QRegister(rm));
42390                                    break;
42391                                  }
42392                                }
42393                                break;
42394                              }
42395                              case 0x00080400: {
42396                                // 0xf3bb0600
42397                                DataType dt1 =
42398                                    Dt_op_1_Decode1((instr >> 7) & 0x3);
42399                                if (dt1.Is(kDataTypeValueInvalid)) {
42400                                  UnallocatedA32(instr);
42401                                  return;
42402                                }
42403                                DataType dt2 =
42404                                    Dt_op_1_Decode2((instr >> 7) & 0x3);
42405                                if (dt2.Is(kDataTypeValueInvalid)) {
42406                                  UnallocatedA32(instr);
42407                                  return;
42408                                }
42409                                unsigned rd = ExtractDRegister(instr, 22, 12);
42410                                unsigned rm = ExtractDRegister(instr, 5, 0);
42411                                // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; A1
42412                                vcvt(al,
42413                                     dt1,
42414                                     dt2,
42415                                     DRegister(rd),
42416                                     DRegister(rm));
42417                                break;
42418                              }
42419                              case 0x00080440: {
42420                                // 0xf3bb0640
42421                                DataType dt1 =
42422                                    Dt_op_1_Decode1((instr >> 7) & 0x3);
42423                                if (dt1.Is(kDataTypeValueInvalid)) {
42424                                  UnallocatedA32(instr);
42425                                  return;
42426                                }
42427                                DataType dt2 =
42428                                    Dt_op_1_Decode2((instr >> 7) & 0x3);
42429                                if (dt2.Is(kDataTypeValueInvalid)) {
42430                                  UnallocatedA32(instr);
42431                                  return;
42432                                }
42433                                if (((instr >> 12) & 1) != 0) {
42434                                  UnallocatedA32(instr);
42435                                  return;
42436                                }
42437                                unsigned rd = ExtractQRegister(instr, 22, 12);
42438                                if ((instr & 1) != 0) {
42439                                  UnallocatedA32(instr);
42440                                  return;
42441                                }
42442                                unsigned rm = ExtractQRegister(instr, 5, 0);
42443                                // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; A1
42444                                vcvt(al,
42445                                     dt1,
42446                                     dt2,
42447                                     QRegister(rd),
42448                                     QRegister(rm));
42449                                break;
42450                              }
42451                              default:
42452                                UnallocatedA32(instr);
42453                                break;
42454                            }
42455                            break;
42456                          }
42457                        }
42458                        break;
42459                      }
42460                      case 0x00000800: {
42461                        // 0xf3b00800
42462                        switch (instr & 0x00000440) {
42463                          case 0x00000000: {
42464                            // 0xf3b00800
42465                            unsigned rd = ExtractDRegister(instr, 22, 12);
42466                            unsigned first = ExtractDRegister(instr, 7, 16);
42467                            unsigned length;
42468                            SpacingType spacing = kSingle;
42469                            switch ((instr >> 8) & 0x3) {
42470                              default:
42471                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
42472                              case 0x0:
42473                                length = 1;
42474                                break;
42475                              case 0x1:
42476                                length = 2;
42477                                break;
42478                              case 0x2:
42479                                length = 3;
42480                                break;
42481                              case 0x3:
42482                                length = 4;
42483                                break;
42484                            }
42485                            unsigned last = first + length - 1;
42486                            TransferType transfer = kMultipleLanes;
42487                            unsigned rm = ExtractDRegister(instr, 5, 0);
42488                            // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
42489                            vtbl(al,
42490                                 Untyped8,
42491                                 DRegister(rd),
42492                                 NeonRegisterList(DRegister(first),
42493                                                  DRegister(last),
42494                                                  spacing,
42495                                                  transfer),
42496                                 DRegister(rm));
42497                            break;
42498                          }
42499                          case 0x00000040: {
42500                            // 0xf3b00840
42501                            unsigned rd = ExtractDRegister(instr, 22, 12);
42502                            unsigned first = ExtractDRegister(instr, 7, 16);
42503                            unsigned length;
42504                            SpacingType spacing = kSingle;
42505                            switch ((instr >> 8) & 0x3) {
42506                              default:
42507                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
42508                              case 0x0:
42509                                length = 1;
42510                                break;
42511                              case 0x1:
42512                                length = 2;
42513                                break;
42514                              case 0x2:
42515                                length = 3;
42516                                break;
42517                              case 0x3:
42518                                length = 4;
42519                                break;
42520                            }
42521                            unsigned last = first + length - 1;
42522                            TransferType transfer = kMultipleLanes;
42523                            unsigned rm = ExtractDRegister(instr, 5, 0);
42524                            // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
42525                            vtbx(al,
42526                                 Untyped8,
42527                                 DRegister(rd),
42528                                 NeonRegisterList(DRegister(first),
42529                                                  DRegister(last),
42530                                                  spacing,
42531                                                  transfer),
42532                                 DRegister(rm));
42533                            break;
42534                          }
42535                          case 0x00000400: {
42536                            // 0xf3b00c00
42537                            if ((instr & 0x00000380) == 0x00000000) {
42538                              unsigned lane;
42539                              DataType dt =
42540                                  Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
42541                              if (dt.Is(kDataTypeValueInvalid)) {
42542                                UnallocatedA32(instr);
42543                                return;
42544                              }
42545                              unsigned rd = ExtractDRegister(instr, 22, 12);
42546                              unsigned rm = ExtractDRegister(instr, 5, 0);
42547                              // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; A1
42548                              vdup(al,
42549                                   dt,
42550                                   DRegister(rd),
42551                                   DRegisterLane(rm, lane));
42552                            } else {
42553                              UnallocatedA32(instr);
42554                            }
42555                            break;
42556                          }
42557                          case 0x00000440: {
42558                            // 0xf3b00c40
42559                            if ((instr & 0x00000380) == 0x00000000) {
42560                              unsigned lane;
42561                              DataType dt =
42562                                  Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
42563                              if (dt.Is(kDataTypeValueInvalid)) {
42564                                UnallocatedA32(instr);
42565                                return;
42566                              }
42567                              if (((instr >> 12) & 1) != 0) {
42568                                UnallocatedA32(instr);
42569                                return;
42570                              }
42571                              unsigned rd = ExtractQRegister(instr, 22, 12);
42572                              unsigned rm = ExtractDRegister(instr, 5, 0);
42573                              // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; A1
42574                              vdup(al,
42575                                   dt,
42576                                   QRegister(rd),
42577                                   DRegisterLane(rm, lane));
42578                            } else {
42579                              UnallocatedA32(instr);
42580                            }
42581                            break;
42582                          }
42583                        }
42584                        break;
42585                      }
42586                    }
42587                    break;
42588                  }
42589                }
42590                break;
42591              }
42592              default: {
42593                switch (instr & 0x00000c40) {
42594                  case 0x00000000: {
42595                    // 0xf2800000
42596                    switch (instr & 0x00000300) {
42597                      case 0x00000000: {
42598                        // 0xf2800000
42599                        if (((instr & 0x300000) == 0x300000)) {
42600                          UnallocatedA32(instr);
42601                          return;
42602                        }
42603                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42604                                                         ((instr >> 22) & 0x4));
42605                        if (dt.Is(kDataTypeValueInvalid)) {
42606                          UnallocatedA32(instr);
42607                          return;
42608                        }
42609                        if (((instr >> 12) & 1) != 0) {
42610                          UnallocatedA32(instr);
42611                          return;
42612                        }
42613                        unsigned rd = ExtractQRegister(instr, 22, 12);
42614                        unsigned rn = ExtractDRegister(instr, 7, 16);
42615                        unsigned rm = ExtractDRegister(instr, 5, 0);
42616                        // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
42617                        vaddl(al,
42618                              dt,
42619                              QRegister(rd),
42620                              DRegister(rn),
42621                              DRegister(rm));
42622                        break;
42623                      }
42624                      case 0x00000100: {
42625                        // 0xf2800100
42626                        if (((instr & 0x300000) == 0x300000)) {
42627                          UnallocatedA32(instr);
42628                          return;
42629                        }
42630                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42631                                                         ((instr >> 22) & 0x4));
42632                        if (dt.Is(kDataTypeValueInvalid)) {
42633                          UnallocatedA32(instr);
42634                          return;
42635                        }
42636                        if (((instr >> 12) & 1) != 0) {
42637                          UnallocatedA32(instr);
42638                          return;
42639                        }
42640                        unsigned rd = ExtractQRegister(instr, 22, 12);
42641                        if (((instr >> 16) & 1) != 0) {
42642                          UnallocatedA32(instr);
42643                          return;
42644                        }
42645                        unsigned rn = ExtractQRegister(instr, 7, 16);
42646                        unsigned rm = ExtractDRegister(instr, 5, 0);
42647                        // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
42648                        vaddw(al,
42649                              dt,
42650                              QRegister(rd),
42651                              QRegister(rn),
42652                              DRegister(rm));
42653                        break;
42654                      }
42655                      case 0x00000200: {
42656                        // 0xf2800200
42657                        if (((instr & 0x300000) == 0x300000)) {
42658                          UnallocatedA32(instr);
42659                          return;
42660                        }
42661                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42662                                                         ((instr >> 22) & 0x4));
42663                        if (dt.Is(kDataTypeValueInvalid)) {
42664                          UnallocatedA32(instr);
42665                          return;
42666                        }
42667                        if (((instr >> 12) & 1) != 0) {
42668                          UnallocatedA32(instr);
42669                          return;
42670                        }
42671                        unsigned rd = ExtractQRegister(instr, 22, 12);
42672                        unsigned rn = ExtractDRegister(instr, 7, 16);
42673                        unsigned rm = ExtractDRegister(instr, 5, 0);
42674                        // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
42675                        vsubl(al,
42676                              dt,
42677                              QRegister(rd),
42678                              DRegister(rn),
42679                              DRegister(rm));
42680                        break;
42681                      }
42682                      case 0x00000300: {
42683                        // 0xf2800300
42684                        if (((instr & 0x300000) == 0x300000)) {
42685                          UnallocatedA32(instr);
42686                          return;
42687                        }
42688                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42689                                                         ((instr >> 22) & 0x4));
42690                        if (dt.Is(kDataTypeValueInvalid)) {
42691                          UnallocatedA32(instr);
42692                          return;
42693                        }
42694                        if (((instr >> 12) & 1) != 0) {
42695                          UnallocatedA32(instr);
42696                          return;
42697                        }
42698                        unsigned rd = ExtractQRegister(instr, 22, 12);
42699                        if (((instr >> 16) & 1) != 0) {
42700                          UnallocatedA32(instr);
42701                          return;
42702                        }
42703                        unsigned rn = ExtractQRegister(instr, 7, 16);
42704                        unsigned rm = ExtractDRegister(instr, 5, 0);
42705                        // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
42706                        vsubw(al,
42707                              dt,
42708                              QRegister(rd),
42709                              QRegister(rn),
42710                              DRegister(rm));
42711                        break;
42712                      }
42713                    }
42714                    break;
42715                  }
42716                  case 0x00000040: {
42717                    // 0xf2800040
42718                    switch (instr & 0x00000200) {
42719                      case 0x00000000: {
42720                        // 0xf2800040
42721                        switch (instr & 0x01000000) {
42722                          case 0x00000000: {
42723                            // 0xf2800040
42724                            if (((instr & 0x300000) == 0x300000)) {
42725                              UnallocatedA32(instr);
42726                              return;
42727                            }
42728                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
42729                                                           (instr >> 8) & 0x1);
42730                            if (dt.Is(kDataTypeValueInvalid)) {
42731                              UnallocatedA32(instr);
42732                              return;
42733                            }
42734                            unsigned rd = ExtractDRegister(instr, 22, 12);
42735                            unsigned rn = ExtractDRegister(instr, 7, 16);
42736                            int lane;
42737                            unsigned rm =
42738                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
42739                            // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
42740                            vmla(al,
42741                                 dt,
42742                                 DRegister(rd),
42743                                 DRegister(rn),
42744                                 DRegisterLane(rm, lane));
42745                            break;
42746                          }
42747                          case 0x01000000: {
42748                            // 0xf3800040
42749                            if (((instr & 0x300000) == 0x300000)) {
42750                              UnallocatedA32(instr);
42751                              return;
42752                            }
42753                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
42754                                                           (instr >> 8) & 0x1);
42755                            if (dt.Is(kDataTypeValueInvalid)) {
42756                              UnallocatedA32(instr);
42757                              return;
42758                            }
42759                            if (((instr >> 12) & 1) != 0) {
42760                              UnallocatedA32(instr);
42761                              return;
42762                            }
42763                            unsigned rd = ExtractQRegister(instr, 22, 12);
42764                            if (((instr >> 16) & 1) != 0) {
42765                              UnallocatedA32(instr);
42766                              return;
42767                            }
42768                            unsigned rn = ExtractQRegister(instr, 7, 16);
42769                            int lane;
42770                            unsigned rm =
42771                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
42772                            // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
42773                            vmla(al,
42774                                 dt,
42775                                 QRegister(rd),
42776                                 QRegister(rn),
42777                                 DRegisterLane(rm, lane));
42778                            break;
42779                          }
42780                        }
42781                        break;
42782                      }
42783                      case 0x00000200: {
42784                        // 0xf2800240
42785                        switch (instr & 0x00000100) {
42786                          case 0x00000000: {
42787                            // 0xf2800240
42788                            if (((instr & 0x300000) == 0x300000)) {
42789                              UnallocatedA32(instr);
42790                              return;
42791                            }
42792                            DataType dt =
42793                                Dt_size_11_Decode((instr >> 20) & 0x3,
42794                                                  (instr >> 24) & 0x1);
42795                            if (dt.Is(kDataTypeValueInvalid)) {
42796                              UnallocatedA32(instr);
42797                              return;
42798                            }
42799                            if (((instr >> 12) & 1) != 0) {
42800                              UnallocatedA32(instr);
42801                              return;
42802                            }
42803                            unsigned rd = ExtractQRegister(instr, 22, 12);
42804                            unsigned rn = ExtractDRegister(instr, 7, 16);
42805                            int lane;
42806                            unsigned rm =
42807                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
42808                            // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
42809                            vmlal(al,
42810                                  dt,
42811                                  QRegister(rd),
42812                                  DRegister(rn),
42813                                  DRegisterLane(rm, lane));
42814                            break;
42815                          }
42816                          case 0x00000100: {
42817                            // 0xf2800340
42818                            if ((instr & 0x01000000) == 0x00000000) {
42819                              if (((instr & 0x300000) == 0x300000)) {
42820                                UnallocatedA32(instr);
42821                                return;
42822                              }
42823                              DataType dt =
42824                                  Dt_size_13_Decode((instr >> 20) & 0x3);
42825                              if (dt.Is(kDataTypeValueInvalid)) {
42826                                UnallocatedA32(instr);
42827                                return;
42828                              }
42829                              if (((instr >> 12) & 1) != 0) {
42830                                UnallocatedA32(instr);
42831                                return;
42832                              }
42833                              unsigned rd = ExtractQRegister(instr, 22, 12);
42834                              unsigned rn = ExtractDRegister(instr, 7, 16);
42835                              uint32_t mvm =
42836                                  (instr & 0xf) | ((instr >> 1) & 0x10);
42837                              uint32_t shift = 4;
42838                              if (dt.Is(S16)) {
42839                                shift = 3;
42840                              }
42841                              uint32_t vm = mvm & ((1 << shift) - 1);
42842                              uint32_t index = mvm >> shift;
42843                              // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
42844                              vqdmlal(al,
42845                                      dt,
42846                                      QRegister(rd),
42847                                      DRegister(rn),
42848                                      DRegister(vm),
42849                                      index);
42850                            } else {
42851                              UnallocatedA32(instr);
42852                            }
42853                            break;
42854                          }
42855                        }
42856                        break;
42857                      }
42858                    }
42859                    break;
42860                  }
42861                  case 0x00000400: {
42862                    // 0xf2800400
42863                    switch (instr & 0x00000300) {
42864                      case 0x00000000: {
42865                        // 0xf2800400
42866                        switch (instr & 0x01000000) {
42867                          case 0x00000000: {
42868                            // 0xf2800400
42869                            if (((instr & 0x300000) == 0x300000)) {
42870                              UnallocatedA32(instr);
42871                              return;
42872                            }
42873                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
42874                            if (dt.Is(kDataTypeValueInvalid)) {
42875                              UnallocatedA32(instr);
42876                              return;
42877                            }
42878                            unsigned rd = ExtractDRegister(instr, 22, 12);
42879                            if (((instr >> 16) & 1) != 0) {
42880                              UnallocatedA32(instr);
42881                              return;
42882                            }
42883                            unsigned rn = ExtractQRegister(instr, 7, 16);
42884                            if ((instr & 1) != 0) {
42885                              UnallocatedA32(instr);
42886                              return;
42887                            }
42888                            unsigned rm = ExtractQRegister(instr, 5, 0);
42889                            // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
42890                            vaddhn(al,
42891                                   dt,
42892                                   DRegister(rd),
42893                                   QRegister(rn),
42894                                   QRegister(rm));
42895                            break;
42896                          }
42897                          case 0x01000000: {
42898                            // 0xf3800400
42899                            if (((instr & 0x300000) == 0x300000)) {
42900                              UnallocatedA32(instr);
42901                              return;
42902                            }
42903                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
42904                            if (dt.Is(kDataTypeValueInvalid)) {
42905                              UnallocatedA32(instr);
42906                              return;
42907                            }
42908                            unsigned rd = ExtractDRegister(instr, 22, 12);
42909                            if (((instr >> 16) & 1) != 0) {
42910                              UnallocatedA32(instr);
42911                              return;
42912                            }
42913                            unsigned rn = ExtractQRegister(instr, 7, 16);
42914                            if ((instr & 1) != 0) {
42915                              UnallocatedA32(instr);
42916                              return;
42917                            }
42918                            unsigned rm = ExtractQRegister(instr, 5, 0);
42919                            // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
42920                            vraddhn(al,
42921                                    dt,
42922                                    DRegister(rd),
42923                                    QRegister(rn),
42924                                    QRegister(rm));
42925                            break;
42926                          }
42927                        }
42928                        break;
42929                      }
42930                      case 0x00000100: {
42931                        // 0xf2800500
42932                        if (((instr & 0x300000) == 0x300000)) {
42933                          UnallocatedA32(instr);
42934                          return;
42935                        }
42936                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42937                                                         ((instr >> 22) & 0x4));
42938                        if (dt.Is(kDataTypeValueInvalid)) {
42939                          UnallocatedA32(instr);
42940                          return;
42941                        }
42942                        if (((instr >> 12) & 1) != 0) {
42943                          UnallocatedA32(instr);
42944                          return;
42945                        }
42946                        unsigned rd = ExtractQRegister(instr, 22, 12);
42947                        unsigned rn = ExtractDRegister(instr, 7, 16);
42948                        unsigned rm = ExtractDRegister(instr, 5, 0);
42949                        // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
42950                        vabal(al,
42951                              dt,
42952                              QRegister(rd),
42953                              DRegister(rn),
42954                              DRegister(rm));
42955                        break;
42956                      }
42957                      case 0x00000200: {
42958                        // 0xf2800600
42959                        switch (instr & 0x01000000) {
42960                          case 0x00000000: {
42961                            // 0xf2800600
42962                            if (((instr & 0x300000) == 0x300000)) {
42963                              UnallocatedA32(instr);
42964                              return;
42965                            }
42966                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
42967                            if (dt.Is(kDataTypeValueInvalid)) {
42968                              UnallocatedA32(instr);
42969                              return;
42970                            }
42971                            unsigned rd = ExtractDRegister(instr, 22, 12);
42972                            if (((instr >> 16) & 1) != 0) {
42973                              UnallocatedA32(instr);
42974                              return;
42975                            }
42976                            unsigned rn = ExtractQRegister(instr, 7, 16);
42977                            if ((instr & 1) != 0) {
42978                              UnallocatedA32(instr);
42979                              return;
42980                            }
42981                            unsigned rm = ExtractQRegister(instr, 5, 0);
42982                            // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
42983                            vsubhn(al,
42984                                   dt,
42985                                   DRegister(rd),
42986                                   QRegister(rn),
42987                                   QRegister(rm));
42988                            break;
42989                          }
42990                          case 0x01000000: {
42991                            // 0xf3800600
42992                            if (((instr & 0x300000) == 0x300000)) {
42993                              UnallocatedA32(instr);
42994                              return;
42995                            }
42996                            DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
42997                            if (dt.Is(kDataTypeValueInvalid)) {
42998                              UnallocatedA32(instr);
42999                              return;
43000                            }
43001                            unsigned rd = ExtractDRegister(instr, 22, 12);
43002                            if (((instr >> 16) & 1) != 0) {
43003                              UnallocatedA32(instr);
43004                              return;
43005                            }
43006                            unsigned rn = ExtractQRegister(instr, 7, 16);
43007                            if ((instr & 1) != 0) {
43008                              UnallocatedA32(instr);
43009                              return;
43010                            }
43011                            unsigned rm = ExtractQRegister(instr, 5, 0);
43012                            // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43013                            vrsubhn(al,
43014                                    dt,
43015                                    DRegister(rd),
43016                                    QRegister(rn),
43017                                    QRegister(rm));
43018                            break;
43019                          }
43020                        }
43021                        break;
43022                      }
43023                      case 0x00000300: {
43024                        // 0xf2800700
43025                        if (((instr & 0x300000) == 0x300000)) {
43026                          UnallocatedA32(instr);
43027                          return;
43028                        }
43029                        DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43030                                                         ((instr >> 22) & 0x4));
43031                        if (dt.Is(kDataTypeValueInvalid)) {
43032                          UnallocatedA32(instr);
43033                          return;
43034                        }
43035                        if (((instr >> 12) & 1) != 0) {
43036                          UnallocatedA32(instr);
43037                          return;
43038                        }
43039                        unsigned rd = ExtractQRegister(instr, 22, 12);
43040                        unsigned rn = ExtractDRegister(instr, 7, 16);
43041                        unsigned rm = ExtractDRegister(instr, 5, 0);
43042                        // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43043                        vabdl(al,
43044                              dt,
43045                              QRegister(rd),
43046                              DRegister(rn),
43047                              DRegister(rm));
43048                        break;
43049                      }
43050                    }
43051                    break;
43052                  }
43053                  case 0x00000440: {
43054                    // 0xf2800440
43055                    switch (instr & 0x00000200) {
43056                      case 0x00000000: {
43057                        // 0xf2800440
43058                        switch (instr & 0x01000000) {
43059                          case 0x00000000: {
43060                            // 0xf2800440
43061                            if (((instr & 0x300000) == 0x300000)) {
43062                              UnallocatedA32(instr);
43063                              return;
43064                            }
43065                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43066                                                           (instr >> 8) & 0x1);
43067                            if (dt.Is(kDataTypeValueInvalid)) {
43068                              UnallocatedA32(instr);
43069                              return;
43070                            }
43071                            unsigned rd = ExtractDRegister(instr, 22, 12);
43072                            unsigned rn = ExtractDRegister(instr, 7, 16);
43073                            int lane;
43074                            unsigned rm =
43075                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43076                            // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43077                            vmls(al,
43078                                 dt,
43079                                 DRegister(rd),
43080                                 DRegister(rn),
43081                                 DRegisterLane(rm, lane));
43082                            break;
43083                          }
43084                          case 0x01000000: {
43085                            // 0xf3800440
43086                            if (((instr & 0x300000) == 0x300000)) {
43087                              UnallocatedA32(instr);
43088                              return;
43089                            }
43090                            DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43091                                                           (instr >> 8) & 0x1);
43092                            if (dt.Is(kDataTypeValueInvalid)) {
43093                              UnallocatedA32(instr);
43094                              return;
43095                            }
43096                            if (((instr >> 12) & 1) != 0) {
43097                              UnallocatedA32(instr);
43098                              return;
43099                            }
43100                            unsigned rd = ExtractQRegister(instr, 22, 12);
43101                            if (((instr >> 16) & 1) != 0) {
43102                              UnallocatedA32(instr);
43103                              return;
43104                            }
43105                            unsigned rn = ExtractQRegister(instr, 7, 16);
43106                            int lane;
43107                            unsigned rm =
43108                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43109                            // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43110                            vmls(al,
43111                                 dt,
43112                                 QRegister(rd),
43113                                 QRegister(rn),
43114                                 DRegisterLane(rm, lane));
43115                            break;
43116                          }
43117                        }
43118                        break;
43119                      }
43120                      case 0x00000200: {
43121                        // 0xf2800640
43122                        switch (instr & 0x00000100) {
43123                          case 0x00000000: {
43124                            // 0xf2800640
43125                            if (((instr & 0x300000) == 0x300000)) {
43126                              UnallocatedA32(instr);
43127                              return;
43128                            }
43129                            DataType dt =
43130                                Dt_size_11_Decode((instr >> 20) & 0x3,
43131                                                  (instr >> 24) & 0x1);
43132                            if (dt.Is(kDataTypeValueInvalid)) {
43133                              UnallocatedA32(instr);
43134                              return;
43135                            }
43136                            if (((instr >> 12) & 1) != 0) {
43137                              UnallocatedA32(instr);
43138                              return;
43139                            }
43140                            unsigned rd = ExtractQRegister(instr, 22, 12);
43141                            unsigned rn = ExtractDRegister(instr, 7, 16);
43142                            int lane;
43143                            unsigned rm =
43144                                ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43145                            // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43146                            vmlsl(al,
43147                                  dt,
43148                                  QRegister(rd),
43149                                  DRegister(rn),
43150                                  DRegisterLane(rm, lane));
43151                            break;
43152                          }
43153                          case 0x00000100: {
43154                            // 0xf2800740
43155                            if ((instr & 0x01000000) == 0x00000000) {
43156                              if (((instr & 0x300000) == 0x300000)) {
43157                                UnallocatedA32(instr);
43158                                return;
43159                              }
43160                              DataType dt =
43161                                  Dt_size_13_Decode((instr >> 20) & 0x3);
43162                              if (dt.Is(kDataTypeValueInvalid)) {
43163                                UnallocatedA32(instr);
43164                                return;
43165                              }
43166                              if (((instr >> 12) & 1) != 0) {
43167                                UnallocatedA32(instr);
43168                                return;
43169                              }
43170                              unsigned rd = ExtractQRegister(instr, 22, 12);
43171                              unsigned rn = ExtractDRegister(instr, 7, 16);
43172                              uint32_t mvm =
43173                                  (instr & 0xf) | ((instr >> 1) & 0x10);
43174                              uint32_t shift = 4;
43175                              if (dt.Is(S16)) {
43176                                shift = 3;
43177                              }
43178                              uint32_t vm = mvm & ((1 << shift) - 1);
43179                              uint32_t index = mvm >> shift;
43180                              // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
43181                              vqdmlsl(al,
43182                                      dt,
43183                                      QRegister(rd),
43184                                      DRegister(rn),
43185                                      DRegister(vm),
43186                                      index);
43187                            } else {
43188                              UnallocatedA32(instr);
43189                            }
43190                            break;
43191                          }
43192                        }
43193                        break;
43194                      }
43195                    }
43196                    break;
43197                  }
43198                  case 0x00000800: {
43199                    // 0xf2800800
43200                    switch (instr & 0x00000300) {
43201                      case 0x00000000: {
43202                        // 0xf2800800
43203                        if (((instr & 0x300000) == 0x300000)) {
43204                          UnallocatedA32(instr);
43205                          return;
43206                        }
43207                        DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
43208                                                        (instr >> 24) & 0x1);
43209                        if (dt.Is(kDataTypeValueInvalid)) {
43210                          UnallocatedA32(instr);
43211                          return;
43212                        }
43213                        if (((instr >> 12) & 1) != 0) {
43214                          UnallocatedA32(instr);
43215                          return;
43216                        }
43217                        unsigned rd = ExtractQRegister(instr, 22, 12);
43218                        unsigned rn = ExtractDRegister(instr, 7, 16);
43219                        unsigned rm = ExtractDRegister(instr, 5, 0);
43220                        // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
43221                        vmlal(al,
43222                              dt,
43223                              QRegister(rd),
43224                              DRegister(rn),
43225                              DRegister(rm));
43226                        break;
43227                      }
43228                      case 0x00000100: {
43229                        // 0xf2800900
43230                        if ((instr & 0x01000000) == 0x00000000) {
43231                          if (((instr & 0x300000) == 0x300000)) {
43232                            UnallocatedA32(instr);
43233                            return;
43234                          }
43235                          DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43236                          if (dt.Is(kDataTypeValueInvalid)) {
43237                            UnallocatedA32(instr);
43238                            return;
43239                          }
43240                          if (((instr >> 12) & 1) != 0) {
43241                            UnallocatedA32(instr);
43242                            return;
43243                          }
43244                          unsigned rd = ExtractQRegister(instr, 22, 12);
43245                          unsigned rn = ExtractDRegister(instr, 7, 16);
43246                          unsigned rm = ExtractDRegister(instr, 5, 0);
43247                          // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43248                          vqdmlal(al,
43249                                  dt,
43250                                  QRegister(rd),
43251                                  DRegister(rn),
43252                                  DRegister(rm));
43253                        } else {
43254                          UnallocatedA32(instr);
43255                        }
43256                        break;
43257                      }
43258                      case 0x00000200: {
43259                        // 0xf2800a00
43260                        if (((instr & 0x300000) == 0x300000)) {
43261                          UnallocatedA32(instr);
43262                          return;
43263                        }
43264                        DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
43265                                                        (instr >> 24) & 0x1);
43266                        if (dt.Is(kDataTypeValueInvalid)) {
43267                          UnallocatedA32(instr);
43268                          return;
43269                        }
43270                        if (((instr >> 12) & 1) != 0) {
43271                          UnallocatedA32(instr);
43272                          return;
43273                        }
43274                        unsigned rd = ExtractQRegister(instr, 22, 12);
43275                        unsigned rn = ExtractDRegister(instr, 7, 16);
43276                        unsigned rm = ExtractDRegister(instr, 5, 0);
43277                        // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
43278                        vmlsl(al,
43279                              dt,
43280                              QRegister(rd),
43281                              DRegister(rn),
43282                              DRegister(rm));
43283                        break;
43284                      }
43285                      case 0x00000300: {
43286                        // 0xf2800b00
43287                        if ((instr & 0x01000000) == 0x00000000) {
43288                          if (((instr & 0x300000) == 0x300000)) {
43289                            UnallocatedA32(instr);
43290                            return;
43291                          }
43292                          DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43293                          if (dt.Is(kDataTypeValueInvalid)) {
43294                            UnallocatedA32(instr);
43295                            return;
43296                          }
43297                          if (((instr >> 12) & 1) != 0) {
43298                            UnallocatedA32(instr);
43299                            return;
43300                          }
43301                          unsigned rd = ExtractQRegister(instr, 22, 12);
43302                          unsigned rn = ExtractDRegister(instr, 7, 16);
43303                          unsigned rm = ExtractDRegister(instr, 5, 0);
43304                          // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43305                          vqdmlsl(al,
43306                                  dt,
43307                                  QRegister(rd),
43308                                  DRegister(rn),
43309                                  DRegister(rm));
43310                        } else {
43311                          UnallocatedA32(instr);
43312                        }
43313                        break;
43314                      }
43315                    }
43316                    break;
43317                  }
43318                  case 0x00000840: {
43319                    // 0xf2800840
43320                    switch (instr & 0x00000200) {
43321                      case 0x00000000: {
43322                        // 0xf2800840
43323                        switch (instr & 0x01000000) {
43324                          case 0x00000000: {
43325                            // 0xf2800840
43326                            if (((instr & 0x300000) == 0x300000)) {
43327                              UnallocatedA32(instr);
43328                              return;
43329                            }
43330                            DataType dt = Dt_F_size_3_Decode(
43331                                ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
43332                            if (dt.Is(kDataTypeValueInvalid)) {
43333                              UnallocatedA32(instr);
43334                              return;
43335                            }
43336                            unsigned rd = ExtractDRegister(instr, 22, 12);
43337                            unsigned rn = ExtractDRegister(instr, 7, 16);
43338                            uint32_t mvm =
43339                                (instr & 0xf) | ((instr >> 1) & 0x10);
43340                            uint32_t shift = 4;
43341                            if (dt.Is(I16)) {
43342                              shift = 3;
43343                            }
43344                            uint32_t vm = mvm & ((1 << shift) - 1);
43345                            uint32_t index = mvm >> shift;
43346                            // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43347                            vmul(al,
43348                                 dt,
43349                                 DRegister(rd),
43350                                 DRegister(rn),
43351                                 DRegister(vm),
43352                                 index);
43353                            break;
43354                          }
43355                          case 0x01000000: {
43356                            // 0xf3800840
43357                            if (((instr & 0x300000) == 0x300000)) {
43358                              UnallocatedA32(instr);
43359                              return;
43360                            }
43361                            DataType dt = Dt_F_size_3_Decode(
43362                                ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
43363                            if (dt.Is(kDataTypeValueInvalid)) {
43364                              UnallocatedA32(instr);
43365                              return;
43366                            }
43367                            if (((instr >> 12) & 1) != 0) {
43368                              UnallocatedA32(instr);
43369                              return;
43370                            }
43371                            unsigned rd = ExtractQRegister(instr, 22, 12);
43372                            if (((instr >> 16) & 1) != 0) {
43373                              UnallocatedA32(instr);
43374                              return;
43375                            }
43376                            unsigned rn = ExtractQRegister(instr, 7, 16);
43377                            uint32_t mvm =
43378                                (instr & 0xf) | ((instr >> 1) & 0x10);
43379                            uint32_t shift = 4;
43380                            if (dt.Is(I16)) {
43381                              shift = 3;
43382                            }
43383                            uint32_t vm = mvm & ((1 << shift) - 1);
43384                            uint32_t index = mvm >> shift;
43385                            // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43386                            vmul(al,
43387                                 dt,
43388                                 QRegister(rd),
43389                                 QRegister(rn),
43390                                 DRegister(vm),
43391                                 index);
43392                            break;
43393                          }
43394                        }
43395                        break;
43396                      }
43397                      case 0x00000200: {
43398                        // 0xf2800a40
43399                        switch (instr & 0x00000100) {
43400                          case 0x00000000: {
43401                            // 0xf2800a40
43402                            if (((instr & 0x300000) == 0x300000)) {
43403                              UnallocatedA32(instr);
43404                              return;
43405                            }
43406                            DataType dt = Dt_U_size_2_Decode(
43407                                ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4));
43408                            if (dt.Is(kDataTypeValueInvalid)) {
43409                              UnallocatedA32(instr);
43410                              return;
43411                            }
43412                            if (((instr >> 12) & 1) != 0) {
43413                              UnallocatedA32(instr);
43414                              return;
43415                            }
43416                            unsigned rd = ExtractQRegister(instr, 22, 12);
43417                            unsigned rn = ExtractDRegister(instr, 7, 16);
43418                            uint32_t mvm =
43419                                (instr & 0xf) | ((instr >> 1) & 0x10);
43420                            uint32_t shift = 4;
43421                            if (dt.Is(S16) || dt.Is(U16)) {
43422                              shift = 3;
43423                            }
43424                            uint32_t vm = mvm & ((1 << shift) - 1);
43425                            uint32_t index = mvm >> shift;
43426                            // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43427                            vmull(al,
43428                                  dt,
43429                                  QRegister(rd),
43430                                  DRegister(rn),
43431                                  DRegister(vm),
43432                                  index);
43433                            break;
43434                          }
43435                          case 0x00000100: {
43436                            // 0xf2800b40
43437                            if ((instr & 0x01000000) == 0x00000000) {
43438                              if (((instr & 0x300000) == 0x300000)) {
43439                                UnallocatedA32(instr);
43440                                return;
43441                              }
43442                              DataType dt =
43443                                  Dt_size_13_Decode((instr >> 20) & 0x3);
43444                              if (dt.Is(kDataTypeValueInvalid)) {
43445                                UnallocatedA32(instr);
43446                                return;
43447                              }
43448                              if (((instr >> 12) & 1) != 0) {
43449                                UnallocatedA32(instr);
43450                                return;
43451                              }
43452                              unsigned rd = ExtractQRegister(instr, 22, 12);
43453                              unsigned rn = ExtractDRegister(instr, 7, 16);
43454                              int lane;
43455                              unsigned rm = ExtractDRegisterAndLane(instr,
43456                                                                    dt,
43457                                                                    5,
43458                                                                    0,
43459                                                                    &lane);
43460                              // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; A2
43461                              vqdmull(al,
43462                                      dt,
43463                                      QRegister(rd),
43464                                      DRegister(rn),
43465                                      DRegisterLane(rm, lane));
43466                            } else {
43467                              UnallocatedA32(instr);
43468                            }
43469                            break;
43470                          }
43471                        }
43472                        break;
43473                      }
43474                    }
43475                    break;
43476                  }
43477                  case 0x00000c00: {
43478                    // 0xf2800c00
43479                    switch (instr & 0x00000100) {
43480                      case 0x00000000: {
43481                        // 0xf2800c00
43482                        if (((instr & 0x300000) == 0x300000)) {
43483                          UnallocatedA32(instr);
43484                          return;
43485                        }
43486                        DataType dt = Dt_op_U_size_1_Decode(
43487                            ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4) |
43488                            ((instr >> 6) & 0x8));
43489                        if (dt.Is(kDataTypeValueInvalid)) {
43490                          UnallocatedA32(instr);
43491                          return;
43492                        }
43493                        if (((instr >> 12) & 1) != 0) {
43494                          UnallocatedA32(instr);
43495                          return;
43496                        }
43497                        unsigned rd = ExtractQRegister(instr, 22, 12);
43498                        unsigned rn = ExtractDRegister(instr, 7, 16);
43499                        unsigned rm = ExtractDRegister(instr, 5, 0);
43500                        // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43501                        vmull(al,
43502                              dt,
43503                              QRegister(rd),
43504                              DRegister(rn),
43505                              DRegister(rm));
43506                        break;
43507                      }
43508                      case 0x00000100: {
43509                        // 0xf2800d00
43510                        if ((instr & 0x01000200) == 0x00000000) {
43511                          if (((instr & 0x300000) == 0x300000)) {
43512                            UnallocatedA32(instr);
43513                            return;
43514                          }
43515                          DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43516                          if (dt.Is(kDataTypeValueInvalid)) {
43517                            UnallocatedA32(instr);
43518                            return;
43519                          }
43520                          if (((instr >> 12) & 1) != 0) {
43521                            UnallocatedA32(instr);
43522                            return;
43523                          }
43524                          unsigned rd = ExtractQRegister(instr, 22, 12);
43525                          unsigned rn = ExtractDRegister(instr, 7, 16);
43526                          unsigned rm = ExtractDRegister(instr, 5, 0);
43527                          // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43528                          vqdmull(al,
43529                                  dt,
43530                                  QRegister(rd),
43531                                  DRegister(rn),
43532                                  DRegister(rm));
43533                        } else {
43534                          UnallocatedA32(instr);
43535                        }
43536                        break;
43537                      }
43538                    }
43539                    break;
43540                  }
43541                  case 0x00000c40: {
43542                    // 0xf2800c40
43543                    switch (instr & 0x01000300) {
43544                      case 0x00000000: {
43545                        // 0xf2800c40
43546                        if (((instr & 0x300000) == 0x300000)) {
43547                          UnallocatedA32(instr);
43548                          return;
43549                        }
43550                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43551                        if (dt.Is(kDataTypeValueInvalid)) {
43552                          UnallocatedA32(instr);
43553                          return;
43554                        }
43555                        unsigned rd = ExtractDRegister(instr, 22, 12);
43556                        unsigned rn = ExtractDRegister(instr, 7, 16);
43557                        int lane;
43558                        unsigned rm =
43559                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43560                        // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
43561                        vqdmulh(al,
43562                                dt,
43563                                DRegister(rd),
43564                                DRegister(rn),
43565                                DRegisterLane(rm, lane));
43566                        break;
43567                      }
43568                      case 0x00000100: {
43569                        // 0xf2800d40
43570                        if (((instr & 0x300000) == 0x300000)) {
43571                          UnallocatedA32(instr);
43572                          return;
43573                        }
43574                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43575                        if (dt.Is(kDataTypeValueInvalid)) {
43576                          UnallocatedA32(instr);
43577                          return;
43578                        }
43579                        unsigned rd = ExtractDRegister(instr, 22, 12);
43580                        unsigned rn = ExtractDRegister(instr, 7, 16);
43581                        int lane;
43582                        unsigned rm =
43583                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43584                        // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
43585                        vqrdmulh(al,
43586                                 dt,
43587                                 DRegister(rd),
43588                                 DRegister(rn),
43589                                 DRegisterLane(rm, lane));
43590                        break;
43591                      }
43592                      case 0x01000000: {
43593                        // 0xf3800c40
43594                        if (((instr & 0x300000) == 0x300000)) {
43595                          UnallocatedA32(instr);
43596                          return;
43597                        }
43598                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43599                        if (dt.Is(kDataTypeValueInvalid)) {
43600                          UnallocatedA32(instr);
43601                          return;
43602                        }
43603                        if (((instr >> 12) & 1) != 0) {
43604                          UnallocatedA32(instr);
43605                          return;
43606                        }
43607                        unsigned rd = ExtractQRegister(instr, 22, 12);
43608                        if (((instr >> 16) & 1) != 0) {
43609                          UnallocatedA32(instr);
43610                          return;
43611                        }
43612                        unsigned rn = ExtractQRegister(instr, 7, 16);
43613                        int lane;
43614                        unsigned rm =
43615                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43616                        // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
43617                        vqdmulh(al,
43618                                dt,
43619                                QRegister(rd),
43620                                QRegister(rn),
43621                                DRegisterLane(rm, lane));
43622                        break;
43623                      }
43624                      case 0x01000100: {
43625                        // 0xf3800d40
43626                        if (((instr & 0x300000) == 0x300000)) {
43627                          UnallocatedA32(instr);
43628                          return;
43629                        }
43630                        DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43631                        if (dt.Is(kDataTypeValueInvalid)) {
43632                          UnallocatedA32(instr);
43633                          return;
43634                        }
43635                        if (((instr >> 12) & 1) != 0) {
43636                          UnallocatedA32(instr);
43637                          return;
43638                        }
43639                        unsigned rd = ExtractQRegister(instr, 22, 12);
43640                        if (((instr >> 16) & 1) != 0) {
43641                          UnallocatedA32(instr);
43642                          return;
43643                        }
43644                        unsigned rn = ExtractQRegister(instr, 7, 16);
43645                        int lane;
43646                        unsigned rm =
43647                            ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43648                        // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
43649                        vqrdmulh(al,
43650                                 dt,
43651                                 QRegister(rd),
43652                                 QRegister(rn),
43653                                 DRegisterLane(rm, lane));
43654                        break;
43655                      }
43656                      default:
43657                        UnallocatedA32(instr);
43658                        break;
43659                    }
43660                    break;
43661                  }
43662                }
43663                break;
43664              }
43665            }
43666            break;
43667          }
43668          case 0x00800010: {
43669            // 0xf2800010
43670            switch (instr & 0x00000040) {
43671              case 0x00000000: {
43672                // 0xf2800010
43673                switch (instr & 0x00000c00) {
43674                  case 0x00000000: {
43675                    // 0xf2800010
43676                    switch (instr & 0x00380080) {
43677                      case 0x00000000: {
43678                        // 0xf2800010
43679                        switch (instr & 0x00000100) {
43680                          case 0x00000000: {
43681                            // 0xf2800010
43682                            switch (instr & 0x00000200) {
43683                              default: {
43684                                switch (instr & 0x00000020) {
43685                                  case 0x00000020: {
43686                                    // 0xf2800030
43687                                    if (((instr & 0xd00) == 0x100) ||
43688                                        ((instr & 0xd00) == 0x500) ||
43689                                        ((instr & 0xd00) == 0x900) ||
43690                                        ((instr & 0xe00) == 0xe00)) {
43691                                      UnallocatedA32(instr);
43692                                      return;
43693                                    }
43694                                    unsigned cmode = (instr >> 8) & 0xf;
43695                                    DataType dt =
43696                                        ImmediateVmvn::DecodeDt(cmode);
43697                                    if (dt.Is(kDataTypeValueInvalid)) {
43698                                      UnallocatedA32(instr);
43699                                      return;
43700                                    }
43701                                    unsigned rd =
43702                                        ExtractDRegister(instr, 22, 12);
43703                                    DOperand imm =
43704                                        ImmediateVmvn::DecodeImmediate(
43705                                            cmode,
43706                                            (instr & 0xf) |
43707                                                ((instr >> 12) & 0x70) |
43708                                                ((instr >> 17) & 0x80));
43709                                    // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
43710                                    vmvn(al, dt, DRegister(rd), imm);
43711                                    break;
43712                                  }
43713                                  default: {
43714                                    if (((instr & 0x920) == 0x100) ||
43715                                        ((instr & 0x520) == 0x100) ||
43716                                        ((instr & 0x820) == 0x20) ||
43717                                        ((instr & 0x420) == 0x20) ||
43718                                        ((instr & 0x220) == 0x20) ||
43719                                        ((instr & 0x120) == 0x120)) {
43720                                      UnallocatedA32(instr);
43721                                      return;
43722                                    }
43723                                    unsigned cmode = ((instr >> 8) & 0xf) |
43724                                                     ((instr >> 1) & 0x10);
43725                                    DataType dt =
43726                                        ImmediateVmov::DecodeDt(cmode);
43727                                    if (dt.Is(kDataTypeValueInvalid)) {
43728                                      UnallocatedA32(instr);
43729                                      return;
43730                                    }
43731                                    unsigned rd =
43732                                        ExtractDRegister(instr, 22, 12);
43733                                    DOperand imm =
43734                                        ImmediateVmov::DecodeImmediate(
43735                                            cmode,
43736                                            (instr & 0xf) |
43737                                                ((instr >> 12) & 0x70) |
43738                                                ((instr >> 17) & 0x80));
43739                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
43740                                    vmov(al, dt, DRegister(rd), imm);
43741                                    break;
43742                                  }
43743                                }
43744                                break;
43745                              }
43746                            }
43747                            break;
43748                          }
43749                          case 0x00000100: {
43750                            // 0xf2800110
43751                            switch (instr & 0x00000020) {
43752                              case 0x00000000: {
43753                                // 0xf2800110
43754                                if (((instr & 0x100) == 0x0) ||
43755                                    ((instr & 0xc00) == 0xc00)) {
43756                                  UnallocatedA32(instr);
43757                                  return;
43758                                }
43759                                unsigned cmode = (instr >> 8) & 0xf;
43760                                DataType dt = ImmediateVorr::DecodeDt(cmode);
43761                                if (dt.Is(kDataTypeValueInvalid)) {
43762                                  UnallocatedA32(instr);
43763                                  return;
43764                                }
43765                                unsigned rd = ExtractDRegister(instr, 22, 12);
43766                                DOperand imm = ImmediateVorr::DecodeImmediate(
43767                                    cmode,
43768                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
43769                                        ((instr >> 17) & 0x80));
43770                                // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
43771                                vorr(al, dt, DRegister(rd), DRegister(rd), imm);
43772                                break;
43773                              }
43774                              case 0x00000020: {
43775                                // 0xf2800130
43776                                if (((instr & 0x100) == 0x0) ||
43777                                    ((instr & 0xc00) == 0xc00)) {
43778                                  UnallocatedA32(instr);
43779                                  return;
43780                                }
43781                                unsigned cmode = (instr >> 8) & 0xf;
43782                                DataType dt = ImmediateVbic::DecodeDt(cmode);
43783                                if (dt.Is(kDataTypeValueInvalid)) {
43784                                  UnallocatedA32(instr);
43785                                  return;
43786                                }
43787                                unsigned rd = ExtractDRegister(instr, 22, 12);
43788                                DOperand imm = ImmediateVbic::DecodeImmediate(
43789                                    cmode,
43790                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
43791                                        ((instr >> 17) & 0x80));
43792                                // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
43793                                vbic(al, dt, DRegister(rd), DRegister(rd), imm);
43794                                break;
43795                              }
43796                            }
43797                            break;
43798                          }
43799                        }
43800                        break;
43801                      }
43802                      default: {
43803                        switch (instr & 0x00000300) {
43804                          case 0x00000000: {
43805                            // 0xf2800010
43806                            if (((instr & 0x380080) == 0x0)) {
43807                              UnallocatedA32(instr);
43808                              return;
43809                            }
43810                            DataType dt =
43811                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
43812                                                       ((instr >> 4) & 0x8),
43813                                                   (instr >> 24) & 0x1);
43814                            if (dt.Is(kDataTypeValueInvalid)) {
43815                              UnallocatedA32(instr);
43816                              return;
43817                            }
43818                            unsigned rd = ExtractDRegister(instr, 22, 12);
43819                            unsigned rm = ExtractDRegister(instr, 5, 0);
43820                            uint32_t imm6 = (instr >> 16) & 0x3f;
43821                            uint32_t imm =
43822                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
43823                                imm6;
43824                            // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
43825                            vshr(al, dt, DRegister(rd), DRegister(rm), imm);
43826                            break;
43827                          }
43828                          case 0x00000100: {
43829                            // 0xf2800110
43830                            if (((instr & 0x380080) == 0x0)) {
43831                              UnallocatedA32(instr);
43832                              return;
43833                            }
43834                            DataType dt =
43835                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
43836                                                       ((instr >> 4) & 0x8),
43837                                                   (instr >> 24) & 0x1);
43838                            if (dt.Is(kDataTypeValueInvalid)) {
43839                              UnallocatedA32(instr);
43840                              return;
43841                            }
43842                            unsigned rd = ExtractDRegister(instr, 22, 12);
43843                            unsigned rm = ExtractDRegister(instr, 5, 0);
43844                            uint32_t imm6 = (instr >> 16) & 0x3f;
43845                            uint32_t imm =
43846                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
43847                                imm6;
43848                            // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
43849                            vsra(al, dt, DRegister(rd), DRegister(rm), imm);
43850                            break;
43851                          }
43852                          case 0x00000200: {
43853                            // 0xf2800210
43854                            if (((instr & 0x380080) == 0x0)) {
43855                              UnallocatedA32(instr);
43856                              return;
43857                            }
43858                            DataType dt =
43859                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
43860                                                       ((instr >> 4) & 0x8),
43861                                                   (instr >> 24) & 0x1);
43862                            if (dt.Is(kDataTypeValueInvalid)) {
43863                              UnallocatedA32(instr);
43864                              return;
43865                            }
43866                            unsigned rd = ExtractDRegister(instr, 22, 12);
43867                            unsigned rm = ExtractDRegister(instr, 5, 0);
43868                            uint32_t imm6 = (instr >> 16) & 0x3f;
43869                            uint32_t imm =
43870                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
43871                                imm6;
43872                            // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
43873                            vrshr(al, dt, DRegister(rd), DRegister(rm), imm);
43874                            break;
43875                          }
43876                          case 0x00000300: {
43877                            // 0xf2800310
43878                            if (((instr & 0x380080) == 0x0)) {
43879                              UnallocatedA32(instr);
43880                              return;
43881                            }
43882                            DataType dt =
43883                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
43884                                                       ((instr >> 4) & 0x8),
43885                                                   (instr >> 24) & 0x1);
43886                            if (dt.Is(kDataTypeValueInvalid)) {
43887                              UnallocatedA32(instr);
43888                              return;
43889                            }
43890                            unsigned rd = ExtractDRegister(instr, 22, 12);
43891                            unsigned rm = ExtractDRegister(instr, 5, 0);
43892                            uint32_t imm6 = (instr >> 16) & 0x3f;
43893                            uint32_t imm =
43894                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
43895                                imm6;
43896                            // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
43897                            vrsra(al, dt, DRegister(rd), DRegister(rm), imm);
43898                            break;
43899                          }
43900                        }
43901                        break;
43902                      }
43903                    }
43904                    break;
43905                  }
43906                  case 0x00000400: {
43907                    // 0xf2800410
43908                    switch (instr & 0x00380080) {
43909                      case 0x00000000: {
43910                        // 0xf2800410
43911                        switch (instr & 0x00000100) {
43912                          case 0x00000000: {
43913                            // 0xf2800410
43914                            switch (instr & 0x00000200) {
43915                              default: {
43916                                switch (instr & 0x00000020) {
43917                                  case 0x00000020: {
43918                                    // 0xf2800430
43919                                    if (((instr & 0xd00) == 0x100) ||
43920                                        ((instr & 0xd00) == 0x500) ||
43921                                        ((instr & 0xd00) == 0x900) ||
43922                                        ((instr & 0xe00) == 0xe00)) {
43923                                      UnallocatedA32(instr);
43924                                      return;
43925                                    }
43926                                    unsigned cmode = (instr >> 8) & 0xf;
43927                                    DataType dt =
43928                                        ImmediateVmvn::DecodeDt(cmode);
43929                                    if (dt.Is(kDataTypeValueInvalid)) {
43930                                      UnallocatedA32(instr);
43931                                      return;
43932                                    }
43933                                    unsigned rd =
43934                                        ExtractDRegister(instr, 22, 12);
43935                                    DOperand imm =
43936                                        ImmediateVmvn::DecodeImmediate(
43937                                            cmode,
43938                                            (instr & 0xf) |
43939                                                ((instr >> 12) & 0x70) |
43940                                                ((instr >> 17) & 0x80));
43941                                    // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
43942                                    vmvn(al, dt, DRegister(rd), imm);
43943                                    break;
43944                                  }
43945                                  default: {
43946                                    if (((instr & 0x920) == 0x100) ||
43947                                        ((instr & 0x520) == 0x100) ||
43948                                        ((instr & 0x820) == 0x20) ||
43949                                        ((instr & 0x420) == 0x20) ||
43950                                        ((instr & 0x220) == 0x20) ||
43951                                        ((instr & 0x120) == 0x120)) {
43952                                      UnallocatedA32(instr);
43953                                      return;
43954                                    }
43955                                    unsigned cmode = ((instr >> 8) & 0xf) |
43956                                                     ((instr >> 1) & 0x10);
43957                                    DataType dt =
43958                                        ImmediateVmov::DecodeDt(cmode);
43959                                    if (dt.Is(kDataTypeValueInvalid)) {
43960                                      UnallocatedA32(instr);
43961                                      return;
43962                                    }
43963                                    unsigned rd =
43964                                        ExtractDRegister(instr, 22, 12);
43965                                    DOperand imm =
43966                                        ImmediateVmov::DecodeImmediate(
43967                                            cmode,
43968                                            (instr & 0xf) |
43969                                                ((instr >> 12) & 0x70) |
43970                                                ((instr >> 17) & 0x80));
43971                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
43972                                    vmov(al, dt, DRegister(rd), imm);
43973                                    break;
43974                                  }
43975                                }
43976                                break;
43977                              }
43978                            }
43979                            break;
43980                          }
43981                          case 0x00000100: {
43982                            // 0xf2800510
43983                            switch (instr & 0x00000020) {
43984                              case 0x00000000: {
43985                                // 0xf2800510
43986                                if (((instr & 0x100) == 0x0) ||
43987                                    ((instr & 0xc00) == 0xc00)) {
43988                                  UnallocatedA32(instr);
43989                                  return;
43990                                }
43991                                unsigned cmode = (instr >> 8) & 0xf;
43992                                DataType dt = ImmediateVorr::DecodeDt(cmode);
43993                                if (dt.Is(kDataTypeValueInvalid)) {
43994                                  UnallocatedA32(instr);
43995                                  return;
43996                                }
43997                                unsigned rd = ExtractDRegister(instr, 22, 12);
43998                                DOperand imm = ImmediateVorr::DecodeImmediate(
43999                                    cmode,
44000                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
44001                                        ((instr >> 17) & 0x80));
44002                                // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44003                                vorr(al, dt, DRegister(rd), DRegister(rd), imm);
44004                                break;
44005                              }
44006                              case 0x00000020: {
44007                                // 0xf2800530
44008                                if (((instr & 0x100) == 0x0) ||
44009                                    ((instr & 0xc00) == 0xc00)) {
44010                                  UnallocatedA32(instr);
44011                                  return;
44012                                }
44013                                unsigned cmode = (instr >> 8) & 0xf;
44014                                DataType dt = ImmediateVbic::DecodeDt(cmode);
44015                                if (dt.Is(kDataTypeValueInvalid)) {
44016                                  UnallocatedA32(instr);
44017                                  return;
44018                                }
44019                                unsigned rd = ExtractDRegister(instr, 22, 12);
44020                                DOperand imm = ImmediateVbic::DecodeImmediate(
44021                                    cmode,
44022                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
44023                                        ((instr >> 17) & 0x80));
44024                                // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44025                                vbic(al, dt, DRegister(rd), DRegister(rd), imm);
44026                                break;
44027                              }
44028                            }
44029                            break;
44030                          }
44031                        }
44032                        break;
44033                      }
44034                      default: {
44035                        switch (instr & 0x00000300) {
44036                          case 0x00000000: {
44037                            // 0xf2800410
44038                            if ((instr & 0x01000000) == 0x01000000) {
44039                              if (((instr & 0x380080) == 0x0)) {
44040                                UnallocatedA32(instr);
44041                                return;
44042                              }
44043                              DataType dt = Dt_L_imm6_4_Decode(
44044                                  ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
44045                              if (dt.Is(kDataTypeValueInvalid)) {
44046                                UnallocatedA32(instr);
44047                                return;
44048                              }
44049                              unsigned rd = ExtractDRegister(instr, 22, 12);
44050                              unsigned rm = ExtractDRegister(instr, 5, 0);
44051                              uint32_t imm6 = (instr >> 16) & 0x3f;
44052                              uint32_t imm =
44053                                  (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44054                                  imm6;
44055                              // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
44056                              vsri(al, dt, DRegister(rd), DRegister(rm), imm);
44057                            } else {
44058                              UnallocatedA32(instr);
44059                            }
44060                            break;
44061                          }
44062                          case 0x00000100: {
44063                            // 0xf2800510
44064                            switch (instr & 0x01000000) {
44065                              case 0x00000000: {
44066                                // 0xf2800510
44067                                if (((instr & 0x380080) == 0x0)) {
44068                                  UnallocatedA32(instr);
44069                                  return;
44070                                }
44071                                DataType dt =
44072                                    Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
44073                                                       ((instr >> 4) & 0x8));
44074                                if (dt.Is(kDataTypeValueInvalid)) {
44075                                  UnallocatedA32(instr);
44076                                  return;
44077                                }
44078                                unsigned rd = ExtractDRegister(instr, 22, 12);
44079                                unsigned rm = ExtractDRegister(instr, 5, 0);
44080                                uint32_t imm6 = (instr >> 16) & 0x3f;
44081                                uint32_t imm =
44082                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44083                                // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44084                                vshl(al, dt, DRegister(rd), DRegister(rm), imm);
44085                                break;
44086                              }
44087                              case 0x01000000: {
44088                                // 0xf3800510
44089                                if (((instr & 0x380080) == 0x0)) {
44090                                  UnallocatedA32(instr);
44091                                  return;
44092                                }
44093                                DataType dt =
44094                                    Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
44095                                                       ((instr >> 4) & 0x8));
44096                                if (dt.Is(kDataTypeValueInvalid)) {
44097                                  UnallocatedA32(instr);
44098                                  return;
44099                                }
44100                                unsigned rd = ExtractDRegister(instr, 22, 12);
44101                                unsigned rm = ExtractDRegister(instr, 5, 0);
44102                                uint32_t imm6 = (instr >> 16) & 0x3f;
44103                                uint32_t imm =
44104                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44105                                // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
44106                                vsli(al, dt, DRegister(rd), DRegister(rm), imm);
44107                                break;
44108                              }
44109                            }
44110                            break;
44111                          }
44112                          case 0x00000200: {
44113                            // 0xf2800610
44114                            if (((instr & 0x380080) == 0x0)) {
44115                              UnallocatedA32(instr);
44116                              return;
44117                            }
44118                            DataType dt =
44119                                Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
44120                                                       ((instr >> 4) & 0x8),
44121                                                   (instr >> 24) & 0x1);
44122                            if (dt.Is(kDataTypeValueInvalid)) {
44123                              UnallocatedA32(instr);
44124                              return;
44125                            }
44126                            unsigned rd = ExtractDRegister(instr, 22, 12);
44127                            unsigned rm = ExtractDRegister(instr, 5, 0);
44128                            uint32_t imm6 = (instr >> 16) & 0x3f;
44129                            uint32_t imm =
44130                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44131                            // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44132                            vqshlu(al, dt, DRegister(rd), DRegister(rm), imm);
44133                            break;
44134                          }
44135                          case 0x00000300: {
44136                            // 0xf2800710
44137                            if (((instr & 0x380080) == 0x0)) {
44138                              UnallocatedA32(instr);
44139                              return;
44140                            }
44141                            DataType dt =
44142                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44143                                                       ((instr >> 4) & 0x8),
44144                                                   (instr >> 24) & 0x1);
44145                            if (dt.Is(kDataTypeValueInvalid)) {
44146                              UnallocatedA32(instr);
44147                              return;
44148                            }
44149                            unsigned rd = ExtractDRegister(instr, 22, 12);
44150                            unsigned rm = ExtractDRegister(instr, 5, 0);
44151                            uint32_t imm6 = (instr >> 16) & 0x3f;
44152                            uint32_t imm =
44153                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44154                            // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44155                            vqshl(al, dt, DRegister(rd), DRegister(rm), imm);
44156                            break;
44157                          }
44158                        }
44159                        break;
44160                      }
44161                    }
44162                    break;
44163                  }
44164                  case 0x00000800: {
44165                    // 0xf2800810
44166                    switch (instr & 0x00000080) {
44167                      case 0x00000000: {
44168                        // 0xf2800810
44169                        switch (instr & 0x00380000) {
44170                          case 0x00000000: {
44171                            // 0xf2800810
44172                            switch (instr & 0x00000100) {
44173                              case 0x00000000: {
44174                                // 0xf2800810
44175                                switch (instr & 0x00000200) {
44176                                  default: {
44177                                    switch (instr & 0x00000020) {
44178                                      case 0x00000020: {
44179                                        // 0xf2800830
44180                                        if (((instr & 0xd00) == 0x100) ||
44181                                            ((instr & 0xd00) == 0x500) ||
44182                                            ((instr & 0xd00) == 0x900) ||
44183                                            ((instr & 0xe00) == 0xe00)) {
44184                                          UnallocatedA32(instr);
44185                                          return;
44186                                        }
44187                                        unsigned cmode = (instr >> 8) & 0xf;
44188                                        DataType dt =
44189                                            ImmediateVmvn::DecodeDt(cmode);
44190                                        if (dt.Is(kDataTypeValueInvalid)) {
44191                                          UnallocatedA32(instr);
44192                                          return;
44193                                        }
44194                                        unsigned rd =
44195                                            ExtractDRegister(instr, 22, 12);
44196                                        DOperand imm =
44197                                            ImmediateVmvn::DecodeImmediate(
44198                                                cmode,
44199                                                (instr & 0xf) |
44200                                                    ((instr >> 12) & 0x70) |
44201                                                    ((instr >> 17) & 0x80));
44202                                        // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44203                                        vmvn(al, dt, DRegister(rd), imm);
44204                                        break;
44205                                      }
44206                                      default: {
44207                                        if (((instr & 0x920) == 0x100) ||
44208                                            ((instr & 0x520) == 0x100) ||
44209                                            ((instr & 0x820) == 0x20) ||
44210                                            ((instr & 0x420) == 0x20) ||
44211                                            ((instr & 0x220) == 0x20) ||
44212                                            ((instr & 0x120) == 0x120)) {
44213                                          UnallocatedA32(instr);
44214                                          return;
44215                                        }
44216                                        unsigned cmode = ((instr >> 8) & 0xf) |
44217                                                         ((instr >> 1) & 0x10);
44218                                        DataType dt =
44219                                            ImmediateVmov::DecodeDt(cmode);
44220                                        if (dt.Is(kDataTypeValueInvalid)) {
44221                                          UnallocatedA32(instr);
44222                                          return;
44223                                        }
44224                                        unsigned rd =
44225                                            ExtractDRegister(instr, 22, 12);
44226                                        DOperand imm =
44227                                            ImmediateVmov::DecodeImmediate(
44228                                                cmode,
44229                                                (instr & 0xf) |
44230                                                    ((instr >> 12) & 0x70) |
44231                                                    ((instr >> 17) & 0x80));
44232                                        // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44233                                        vmov(al, dt, DRegister(rd), imm);
44234                                        break;
44235                                      }
44236                                    }
44237                                    break;
44238                                  }
44239                                }
44240                                break;
44241                              }
44242                              case 0x00000100: {
44243                                // 0xf2800910
44244                                switch (instr & 0x00000020) {
44245                                  case 0x00000000: {
44246                                    // 0xf2800910
44247                                    if (((instr & 0x100) == 0x0) ||
44248                                        ((instr & 0xc00) == 0xc00)) {
44249                                      UnallocatedA32(instr);
44250                                      return;
44251                                    }
44252                                    unsigned cmode = (instr >> 8) & 0xf;
44253                                    DataType dt =
44254                                        ImmediateVorr::DecodeDt(cmode);
44255                                    if (dt.Is(kDataTypeValueInvalid)) {
44256                                      UnallocatedA32(instr);
44257                                      return;
44258                                    }
44259                                    unsigned rd =
44260                                        ExtractDRegister(instr, 22, 12);
44261                                    DOperand imm =
44262                                        ImmediateVorr::DecodeImmediate(
44263                                            cmode,
44264                                            (instr & 0xf) |
44265                                                ((instr >> 12) & 0x70) |
44266                                                ((instr >> 17) & 0x80));
44267                                    // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44268                                    vorr(al,
44269                                         dt,
44270                                         DRegister(rd),
44271                                         DRegister(rd),
44272                                         imm);
44273                                    break;
44274                                  }
44275                                  case 0x00000020: {
44276                                    // 0xf2800930
44277                                    if (((instr & 0x100) == 0x0) ||
44278                                        ((instr & 0xc00) == 0xc00)) {
44279                                      UnallocatedA32(instr);
44280                                      return;
44281                                    }
44282                                    unsigned cmode = (instr >> 8) & 0xf;
44283                                    DataType dt =
44284                                        ImmediateVbic::DecodeDt(cmode);
44285                                    if (dt.Is(kDataTypeValueInvalid)) {
44286                                      UnallocatedA32(instr);
44287                                      return;
44288                                    }
44289                                    unsigned rd =
44290                                        ExtractDRegister(instr, 22, 12);
44291                                    DOperand imm =
44292                                        ImmediateVbic::DecodeImmediate(
44293                                            cmode,
44294                                            (instr & 0xf) |
44295                                                ((instr >> 12) & 0x70) |
44296                                                ((instr >> 17) & 0x80));
44297                                    // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44298                                    vbic(al,
44299                                         dt,
44300                                         DRegister(rd),
44301                                         DRegister(rd),
44302                                         imm);
44303                                    break;
44304                                  }
44305                                }
44306                                break;
44307                              }
44308                            }
44309                            break;
44310                          }
44311                          case 0x00180000: {
44312                            // 0xf2980810
44313                            switch (instr & 0x00000300) {
44314                              case 0x00000000: {
44315                                // 0xf2980810
44316                                switch (instr & 0x01000000) {
44317                                  case 0x00000000: {
44318                                    // 0xf2980810
44319                                    if (((instr & 0x380000) == 0x0)) {
44320                                      UnallocatedA32(instr);
44321                                      return;
44322                                    }
44323                                    DataType dt =
44324                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
44325                                    if (dt.Is(kDataTypeValueInvalid)) {
44326                                      UnallocatedA32(instr);
44327                                      return;
44328                                    }
44329                                    unsigned rd =
44330                                        ExtractDRegister(instr, 22, 12);
44331                                    if ((instr & 1) != 0) {
44332                                      UnallocatedA32(instr);
44333                                      return;
44334                                    }
44335                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44336                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44337                                    uint32_t imm = dt.GetSize() - imm6;
44338                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44339                                    vshrn(al,
44340                                          dt,
44341                                          DRegister(rd),
44342                                          QRegister(rm),
44343                                          imm);
44344                                    break;
44345                                  }
44346                                  case 0x01000000: {
44347                                    // 0xf3980810
44348                                    if (((instr & 0x380000) == 0x0)) {
44349                                      UnallocatedA32(instr);
44350                                      return;
44351                                    }
44352                                    DataType dt =
44353                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
44354                                                         (instr >> 24) & 0x1);
44355                                    if (dt.Is(kDataTypeValueInvalid)) {
44356                                      UnallocatedA32(instr);
44357                                      return;
44358                                    }
44359                                    unsigned rd =
44360                                        ExtractDRegister(instr, 22, 12);
44361                                    if ((instr & 1) != 0) {
44362                                      UnallocatedA32(instr);
44363                                      return;
44364                                    }
44365                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44366                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44367                                    uint32_t imm = dt.GetSize() - imm6;
44368                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44369                                    vqshrun(al,
44370                                            dt,
44371                                            DRegister(rd),
44372                                            QRegister(rm),
44373                                            imm);
44374                                    break;
44375                                  }
44376                                }
44377                                break;
44378                              }
44379                              case 0x00000100: {
44380                                // 0xf2980910
44381                                if (((instr & 0x380000) == 0x0)) {
44382                                  UnallocatedA32(instr);
44383                                  return;
44384                                }
44385                                DataType dt =
44386                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
44387                                                     (instr >> 24) & 0x1);
44388                                if (dt.Is(kDataTypeValueInvalid)) {
44389                                  UnallocatedA32(instr);
44390                                  return;
44391                                }
44392                                unsigned rd = ExtractDRegister(instr, 22, 12);
44393                                if ((instr & 1) != 0) {
44394                                  UnallocatedA32(instr);
44395                                  return;
44396                                }
44397                                unsigned rm = ExtractQRegister(instr, 5, 0);
44398                                uint32_t imm6 = (instr >> 16) & 0x3f;
44399                                uint32_t imm = dt.GetSize() - imm6;
44400                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44401                                vqshrn(al,
44402                                       dt,
44403                                       DRegister(rd),
44404                                       QRegister(rm),
44405                                       imm);
44406                                break;
44407                              }
44408                              case 0x00000200: {
44409                                // 0xf2980a10
44410                                if (((instr & 0x380000) == 0x0) ||
44411                                    ((instr & 0x3f0000) == 0x80000) ||
44412                                    ((instr & 0x3f0000) == 0x100000) ||
44413                                    ((instr & 0x3f0000) == 0x200000)) {
44414                                  UnallocatedA32(instr);
44415                                  return;
44416                                }
44417                                DataType dt =
44418                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
44419                                                     (instr >> 24) & 0x1);
44420                                if (dt.Is(kDataTypeValueInvalid)) {
44421                                  UnallocatedA32(instr);
44422                                  return;
44423                                }
44424                                if (((instr >> 12) & 1) != 0) {
44425                                  UnallocatedA32(instr);
44426                                  return;
44427                                }
44428                                unsigned rd = ExtractQRegister(instr, 22, 12);
44429                                unsigned rm = ExtractDRegister(instr, 5, 0);
44430                                uint32_t imm6 = (instr >> 16) & 0x3f;
44431                                uint32_t imm = imm6 - dt.GetSize();
44432                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44433                                vshll(al,
44434                                      dt,
44435                                      QRegister(rd),
44436                                      DRegister(rm),
44437                                      imm);
44438                                break;
44439                              }
44440                              default:
44441                                UnallocatedA32(instr);
44442                                break;
44443                            }
44444                            break;
44445                          }
44446                          case 0x00280000: {
44447                            // 0xf2a80810
44448                            switch (instr & 0x00000300) {
44449                              case 0x00000000: {
44450                                // 0xf2a80810
44451                                switch (instr & 0x01000000) {
44452                                  case 0x00000000: {
44453                                    // 0xf2a80810
44454                                    if (((instr & 0x380000) == 0x0)) {
44455                                      UnallocatedA32(instr);
44456                                      return;
44457                                    }
44458                                    DataType dt =
44459                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
44460                                    if (dt.Is(kDataTypeValueInvalid)) {
44461                                      UnallocatedA32(instr);
44462                                      return;
44463                                    }
44464                                    unsigned rd =
44465                                        ExtractDRegister(instr, 22, 12);
44466                                    if ((instr & 1) != 0) {
44467                                      UnallocatedA32(instr);
44468                                      return;
44469                                    }
44470                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44471                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44472                                    uint32_t imm = dt.GetSize() - imm6;
44473                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44474                                    vshrn(al,
44475                                          dt,
44476                                          DRegister(rd),
44477                                          QRegister(rm),
44478                                          imm);
44479                                    break;
44480                                  }
44481                                  case 0x01000000: {
44482                                    // 0xf3a80810
44483                                    if (((instr & 0x380000) == 0x0)) {
44484                                      UnallocatedA32(instr);
44485                                      return;
44486                                    }
44487                                    DataType dt =
44488                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
44489                                                         (instr >> 24) & 0x1);
44490                                    if (dt.Is(kDataTypeValueInvalid)) {
44491                                      UnallocatedA32(instr);
44492                                      return;
44493                                    }
44494                                    unsigned rd =
44495                                        ExtractDRegister(instr, 22, 12);
44496                                    if ((instr & 1) != 0) {
44497                                      UnallocatedA32(instr);
44498                                      return;
44499                                    }
44500                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44501                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44502                                    uint32_t imm = dt.GetSize() - imm6;
44503                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44504                                    vqshrun(al,
44505                                            dt,
44506                                            DRegister(rd),
44507                                            QRegister(rm),
44508                                            imm);
44509                                    break;
44510                                  }
44511                                }
44512                                break;
44513                              }
44514                              case 0x00000100: {
44515                                // 0xf2a80910
44516                                if (((instr & 0x380000) == 0x0)) {
44517                                  UnallocatedA32(instr);
44518                                  return;
44519                                }
44520                                DataType dt =
44521                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
44522                                                     (instr >> 24) & 0x1);
44523                                if (dt.Is(kDataTypeValueInvalid)) {
44524                                  UnallocatedA32(instr);
44525                                  return;
44526                                }
44527                                unsigned rd = ExtractDRegister(instr, 22, 12);
44528                                if ((instr & 1) != 0) {
44529                                  UnallocatedA32(instr);
44530                                  return;
44531                                }
44532                                unsigned rm = ExtractQRegister(instr, 5, 0);
44533                                uint32_t imm6 = (instr >> 16) & 0x3f;
44534                                uint32_t imm = dt.GetSize() - imm6;
44535                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44536                                vqshrn(al,
44537                                       dt,
44538                                       DRegister(rd),
44539                                       QRegister(rm),
44540                                       imm);
44541                                break;
44542                              }
44543                              case 0x00000200: {
44544                                // 0xf2a80a10
44545                                if (((instr & 0x380000) == 0x0) ||
44546                                    ((instr & 0x3f0000) == 0x80000) ||
44547                                    ((instr & 0x3f0000) == 0x100000) ||
44548                                    ((instr & 0x3f0000) == 0x200000)) {
44549                                  UnallocatedA32(instr);
44550                                  return;
44551                                }
44552                                DataType dt =
44553                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
44554                                                     (instr >> 24) & 0x1);
44555                                if (dt.Is(kDataTypeValueInvalid)) {
44556                                  UnallocatedA32(instr);
44557                                  return;
44558                                }
44559                                if (((instr >> 12) & 1) != 0) {
44560                                  UnallocatedA32(instr);
44561                                  return;
44562                                }
44563                                unsigned rd = ExtractQRegister(instr, 22, 12);
44564                                unsigned rm = ExtractDRegister(instr, 5, 0);
44565                                uint32_t imm6 = (instr >> 16) & 0x3f;
44566                                uint32_t imm = imm6 - dt.GetSize();
44567                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44568                                vshll(al,
44569                                      dt,
44570                                      QRegister(rd),
44571                                      DRegister(rm),
44572                                      imm);
44573                                break;
44574                              }
44575                              default:
44576                                UnallocatedA32(instr);
44577                                break;
44578                            }
44579                            break;
44580                          }
44581                          case 0x00300000: {
44582                            // 0xf2b00810
44583                            switch (instr & 0x00000300) {
44584                              case 0x00000000: {
44585                                // 0xf2b00810
44586                                switch (instr & 0x01000000) {
44587                                  case 0x00000000: {
44588                                    // 0xf2b00810
44589                                    if (((instr & 0x380000) == 0x0)) {
44590                                      UnallocatedA32(instr);
44591                                      return;
44592                                    }
44593                                    DataType dt =
44594                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
44595                                    if (dt.Is(kDataTypeValueInvalid)) {
44596                                      UnallocatedA32(instr);
44597                                      return;
44598                                    }
44599                                    unsigned rd =
44600                                        ExtractDRegister(instr, 22, 12);
44601                                    if ((instr & 1) != 0) {
44602                                      UnallocatedA32(instr);
44603                                      return;
44604                                    }
44605                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44606                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44607                                    uint32_t imm = dt.GetSize() - imm6;
44608                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44609                                    vshrn(al,
44610                                          dt,
44611                                          DRegister(rd),
44612                                          QRegister(rm),
44613                                          imm);
44614                                    break;
44615                                  }
44616                                  case 0x01000000: {
44617                                    // 0xf3b00810
44618                                    if (((instr & 0x380000) == 0x0)) {
44619                                      UnallocatedA32(instr);
44620                                      return;
44621                                    }
44622                                    DataType dt =
44623                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
44624                                                         (instr >> 24) & 0x1);
44625                                    if (dt.Is(kDataTypeValueInvalid)) {
44626                                      UnallocatedA32(instr);
44627                                      return;
44628                                    }
44629                                    unsigned rd =
44630                                        ExtractDRegister(instr, 22, 12);
44631                                    if ((instr & 1) != 0) {
44632                                      UnallocatedA32(instr);
44633                                      return;
44634                                    }
44635                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44636                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44637                                    uint32_t imm = dt.GetSize() - imm6;
44638                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44639                                    vqshrun(al,
44640                                            dt,
44641                                            DRegister(rd),
44642                                            QRegister(rm),
44643                                            imm);
44644                                    break;
44645                                  }
44646                                }
44647                                break;
44648                              }
44649                              case 0x00000100: {
44650                                // 0xf2b00910
44651                                if (((instr & 0x380000) == 0x0)) {
44652                                  UnallocatedA32(instr);
44653                                  return;
44654                                }
44655                                DataType dt =
44656                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
44657                                                     (instr >> 24) & 0x1);
44658                                if (dt.Is(kDataTypeValueInvalid)) {
44659                                  UnallocatedA32(instr);
44660                                  return;
44661                                }
44662                                unsigned rd = ExtractDRegister(instr, 22, 12);
44663                                if ((instr & 1) != 0) {
44664                                  UnallocatedA32(instr);
44665                                  return;
44666                                }
44667                                unsigned rm = ExtractQRegister(instr, 5, 0);
44668                                uint32_t imm6 = (instr >> 16) & 0x3f;
44669                                uint32_t imm = dt.GetSize() - imm6;
44670                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44671                                vqshrn(al,
44672                                       dt,
44673                                       DRegister(rd),
44674                                       QRegister(rm),
44675                                       imm);
44676                                break;
44677                              }
44678                              case 0x00000200: {
44679                                // 0xf2b00a10
44680                                if (((instr & 0x380000) == 0x0) ||
44681                                    ((instr & 0x3f0000) == 0x80000) ||
44682                                    ((instr & 0x3f0000) == 0x100000) ||
44683                                    ((instr & 0x3f0000) == 0x200000)) {
44684                                  UnallocatedA32(instr);
44685                                  return;
44686                                }
44687                                DataType dt =
44688                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
44689                                                     (instr >> 24) & 0x1);
44690                                if (dt.Is(kDataTypeValueInvalid)) {
44691                                  UnallocatedA32(instr);
44692                                  return;
44693                                }
44694                                if (((instr >> 12) & 1) != 0) {
44695                                  UnallocatedA32(instr);
44696                                  return;
44697                                }
44698                                unsigned rd = ExtractQRegister(instr, 22, 12);
44699                                unsigned rm = ExtractDRegister(instr, 5, 0);
44700                                uint32_t imm6 = (instr >> 16) & 0x3f;
44701                                uint32_t imm = imm6 - dt.GetSize();
44702                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44703                                vshll(al,
44704                                      dt,
44705                                      QRegister(rd),
44706                                      DRegister(rm),
44707                                      imm);
44708                                break;
44709                              }
44710                              default:
44711                                UnallocatedA32(instr);
44712                                break;
44713                            }
44714                            break;
44715                          }
44716                          case 0x00380000: {
44717                            // 0xf2b80810
44718                            switch (instr & 0x00000300) {
44719                              case 0x00000000: {
44720                                // 0xf2b80810
44721                                switch (instr & 0x01000000) {
44722                                  case 0x00000000: {
44723                                    // 0xf2b80810
44724                                    if (((instr & 0x380000) == 0x0)) {
44725                                      UnallocatedA32(instr);
44726                                      return;
44727                                    }
44728                                    DataType dt =
44729                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
44730                                    if (dt.Is(kDataTypeValueInvalid)) {
44731                                      UnallocatedA32(instr);
44732                                      return;
44733                                    }
44734                                    unsigned rd =
44735                                        ExtractDRegister(instr, 22, 12);
44736                                    if ((instr & 1) != 0) {
44737                                      UnallocatedA32(instr);
44738                                      return;
44739                                    }
44740                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44741                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44742                                    uint32_t imm = dt.GetSize() - imm6;
44743                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44744                                    vshrn(al,
44745                                          dt,
44746                                          DRegister(rd),
44747                                          QRegister(rm),
44748                                          imm);
44749                                    break;
44750                                  }
44751                                  case 0x01000000: {
44752                                    // 0xf3b80810
44753                                    if (((instr & 0x380000) == 0x0)) {
44754                                      UnallocatedA32(instr);
44755                                      return;
44756                                    }
44757                                    DataType dt =
44758                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
44759                                                         (instr >> 24) & 0x1);
44760                                    if (dt.Is(kDataTypeValueInvalid)) {
44761                                      UnallocatedA32(instr);
44762                                      return;
44763                                    }
44764                                    unsigned rd =
44765                                        ExtractDRegister(instr, 22, 12);
44766                                    if ((instr & 1) != 0) {
44767                                      UnallocatedA32(instr);
44768                                      return;
44769                                    }
44770                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44771                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44772                                    uint32_t imm = dt.GetSize() - imm6;
44773                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44774                                    vqshrun(al,
44775                                            dt,
44776                                            DRegister(rd),
44777                                            QRegister(rm),
44778                                            imm);
44779                                    break;
44780                                  }
44781                                }
44782                                break;
44783                              }
44784                              case 0x00000100: {
44785                                // 0xf2b80910
44786                                if (((instr & 0x380000) == 0x0)) {
44787                                  UnallocatedA32(instr);
44788                                  return;
44789                                }
44790                                DataType dt =
44791                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
44792                                                     (instr >> 24) & 0x1);
44793                                if (dt.Is(kDataTypeValueInvalid)) {
44794                                  UnallocatedA32(instr);
44795                                  return;
44796                                }
44797                                unsigned rd = ExtractDRegister(instr, 22, 12);
44798                                if ((instr & 1) != 0) {
44799                                  UnallocatedA32(instr);
44800                                  return;
44801                                }
44802                                unsigned rm = ExtractQRegister(instr, 5, 0);
44803                                uint32_t imm6 = (instr >> 16) & 0x3f;
44804                                uint32_t imm = dt.GetSize() - imm6;
44805                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44806                                vqshrn(al,
44807                                       dt,
44808                                       DRegister(rd),
44809                                       QRegister(rm),
44810                                       imm);
44811                                break;
44812                              }
44813                              case 0x00000200: {
44814                                // 0xf2b80a10
44815                                if (((instr & 0x380000) == 0x0) ||
44816                                    ((instr & 0x3f0000) == 0x80000) ||
44817                                    ((instr & 0x3f0000) == 0x100000) ||
44818                                    ((instr & 0x3f0000) == 0x200000)) {
44819                                  UnallocatedA32(instr);
44820                                  return;
44821                                }
44822                                DataType dt =
44823                                    Dt_imm6_4_Decode((instr >> 19) & 0x7,
44824                                                     (instr >> 24) & 0x1);
44825                                if (dt.Is(kDataTypeValueInvalid)) {
44826                                  UnallocatedA32(instr);
44827                                  return;
44828                                }
44829                                if (((instr >> 12) & 1) != 0) {
44830                                  UnallocatedA32(instr);
44831                                  return;
44832                                }
44833                                unsigned rd = ExtractQRegister(instr, 22, 12);
44834                                unsigned rm = ExtractDRegister(instr, 5, 0);
44835                                uint32_t imm6 = (instr >> 16) & 0x3f;
44836                                uint32_t imm = imm6 - dt.GetSize();
44837                                // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44838                                vshll(al,
44839                                      dt,
44840                                      QRegister(rd),
44841                                      DRegister(rm),
44842                                      imm);
44843                                break;
44844                              }
44845                              default:
44846                                UnallocatedA32(instr);
44847                                break;
44848                            }
44849                            break;
44850                          }
44851                          default: {
44852                            switch (instr & 0x00000300) {
44853                              case 0x00000000: {
44854                                // 0xf2800810
44855                                switch (instr & 0x01000000) {
44856                                  case 0x00000000: {
44857                                    // 0xf2800810
44858                                    if (((instr & 0x380000) == 0x0)) {
44859                                      UnallocatedA32(instr);
44860                                      return;
44861                                    }
44862                                    DataType dt =
44863                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
44864                                    if (dt.Is(kDataTypeValueInvalid)) {
44865                                      UnallocatedA32(instr);
44866                                      return;
44867                                    }
44868                                    unsigned rd =
44869                                        ExtractDRegister(instr, 22, 12);
44870                                    if ((instr & 1) != 0) {
44871                                      UnallocatedA32(instr);
44872                                      return;
44873                                    }
44874                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44875                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44876                                    uint32_t imm = dt.GetSize() - imm6;
44877                                    // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44878                                    vshrn(al,
44879                                          dt,
44880                                          DRegister(rd),
44881                                          QRegister(rm),
44882                                          imm);
44883                                    break;
44884                                  }
44885                                  case 0x01000000: {
44886                                    // 0xf3800810
44887                                    if (((instr & 0x380000) == 0x0)) {
44888                                      UnallocatedA32(instr);
44889                                      return;
44890                                    }
44891                                    DataType dt =
44892                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
44893                                                         (instr >> 24) & 0x1);
44894                                    if (dt.Is(kDataTypeValueInvalid)) {
44895                                      UnallocatedA32(instr);
44896                                      return;
44897                                    }
44898                                    unsigned rd =
44899                                        ExtractDRegister(instr, 22, 12);
44900                                    if ((instr & 1) != 0) {
44901                                      UnallocatedA32(instr);
44902                                      return;
44903                                    }
44904                                    unsigned rm = ExtractQRegister(instr, 5, 0);
44905                                    uint32_t imm6 = (instr >> 16) & 0x3f;
44906                                    uint32_t imm = dt.GetSize() - imm6;
44907                                    // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44908                                    vqshrun(al,
44909                                            dt,
44910                                            DRegister(rd),
44911                                            QRegister(rm),
44912                                            imm);
44913                                    break;
44914                                  }
44915                                }
44916                                break;
44917                              }
44918                              case 0x00000100: {
44919                                // 0xf2800910
44920                                if (((instr & 0x380000) == 0x0)) {
44921                                  UnallocatedA32(instr);
44922                                  return;
44923                                }
44924                                DataType dt =
44925                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
44926                                                     (instr >> 24) & 0x1);
44927                                if (dt.Is(kDataTypeValueInvalid)) {
44928                                  UnallocatedA32(instr);
44929                                  return;
44930                                }
44931                                unsigned rd = ExtractDRegister(instr, 22, 12);
44932                                if ((instr & 1) != 0) {
44933                                  UnallocatedA32(instr);
44934                                  return;
44935                                }
44936                                unsigned rm = ExtractQRegister(instr, 5, 0);
44937                                uint32_t imm6 = (instr >> 16) & 0x3f;
44938                                uint32_t imm = dt.GetSize() - imm6;
44939                                // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44940                                vqshrn(al,
44941                                       dt,
44942                                       DRegister(rd),
44943                                       QRegister(rm),
44944                                       imm);
44945                                break;
44946                              }
44947                              case 0x00000200: {
44948                                // 0xf2800a10
44949                                switch (instr & 0x00070000) {
44950                                  case 0x00000000: {
44951                                    // 0xf2800a10
44952                                    switch (instr & 0x003f0000) {
44953                                      case 0x00080000: {
44954                                        // 0xf2880a10
44955                                        if (((instr & 0x380000) == 0x0) ||
44956                                            ((instr & 0x380000) == 0x180000) ||
44957                                            ((instr & 0x380000) == 0x280000) ||
44958                                            ((instr & 0x380000) == 0x300000) ||
44959                                            ((instr & 0x380000) == 0x380000)) {
44960                                          UnallocatedA32(instr);
44961                                          return;
44962                                        }
44963                                        DataType dt = Dt_U_imm3H_1_Decode(
44964                                            ((instr >> 19) & 0x7) |
44965                                            ((instr >> 21) & 0x8));
44966                                        if (dt.Is(kDataTypeValueInvalid)) {
44967                                          UnallocatedA32(instr);
44968                                          return;
44969                                        }
44970                                        if (((instr >> 12) & 1) != 0) {
44971                                          UnallocatedA32(instr);
44972                                          return;
44973                                        }
44974                                        unsigned rd =
44975                                            ExtractQRegister(instr, 22, 12);
44976                                        unsigned rm =
44977                                            ExtractDRegister(instr, 5, 0);
44978                                        // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
44979                                        vmovl(al,
44980                                              dt,
44981                                              QRegister(rd),
44982                                              DRegister(rm));
44983                                        break;
44984                                      }
44985                                      case 0x00090000: {
44986                                        // 0xf2890a10
44987                                        if (((instr & 0x380000) == 0x0) ||
44988                                            ((instr & 0x3f0000) == 0x80000) ||
44989                                            ((instr & 0x3f0000) == 0x100000) ||
44990                                            ((instr & 0x3f0000) == 0x200000)) {
44991                                          UnallocatedA32(instr);
44992                                          return;
44993                                        }
44994                                        DataType dt =
44995                                            Dt_imm6_4_Decode((instr >> 19) &
44996                                                                 0x7,
44997                                                             (instr >> 24) &
44998                                                                 0x1);
44999                                        if (dt.Is(kDataTypeValueInvalid)) {
45000                                          UnallocatedA32(instr);
45001                                          return;
45002                                        }
45003                                        if (((instr >> 12) & 1) != 0) {
45004                                          UnallocatedA32(instr);
45005                                          return;
45006                                        }
45007                                        unsigned rd =
45008                                            ExtractQRegister(instr, 22, 12);
45009                                        unsigned rm =
45010                                            ExtractDRegister(instr, 5, 0);
45011                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45012                                        uint32_t imm = imm6 - dt.GetSize();
45013                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45014                                        vshll(al,
45015                                              dt,
45016                                              QRegister(rd),
45017                                              DRegister(rm),
45018                                              imm);
45019                                        break;
45020                                      }
45021                                      case 0x000a0000: {
45022                                        // 0xf28a0a10
45023                                        if (((instr & 0x380000) == 0x0) ||
45024                                            ((instr & 0x3f0000) == 0x80000) ||
45025                                            ((instr & 0x3f0000) == 0x100000) ||
45026                                            ((instr & 0x3f0000) == 0x200000)) {
45027                                          UnallocatedA32(instr);
45028                                          return;
45029                                        }
45030                                        DataType dt =
45031                                            Dt_imm6_4_Decode((instr >> 19) &
45032                                                                 0x7,
45033                                                             (instr >> 24) &
45034                                                                 0x1);
45035                                        if (dt.Is(kDataTypeValueInvalid)) {
45036                                          UnallocatedA32(instr);
45037                                          return;
45038                                        }
45039                                        if (((instr >> 12) & 1) != 0) {
45040                                          UnallocatedA32(instr);
45041                                          return;
45042                                        }
45043                                        unsigned rd =
45044                                            ExtractQRegister(instr, 22, 12);
45045                                        unsigned rm =
45046                                            ExtractDRegister(instr, 5, 0);
45047                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45048                                        uint32_t imm = imm6 - dt.GetSize();
45049                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45050                                        vshll(al,
45051                                              dt,
45052                                              QRegister(rd),
45053                                              DRegister(rm),
45054                                              imm);
45055                                        break;
45056                                      }
45057                                      case 0x000b0000: {
45058                                        // 0xf28b0a10
45059                                        if (((instr & 0x380000) == 0x0) ||
45060                                            ((instr & 0x3f0000) == 0x80000) ||
45061                                            ((instr & 0x3f0000) == 0x100000) ||
45062                                            ((instr & 0x3f0000) == 0x200000)) {
45063                                          UnallocatedA32(instr);
45064                                          return;
45065                                        }
45066                                        DataType dt =
45067                                            Dt_imm6_4_Decode((instr >> 19) &
45068                                                                 0x7,
45069                                                             (instr >> 24) &
45070                                                                 0x1);
45071                                        if (dt.Is(kDataTypeValueInvalid)) {
45072                                          UnallocatedA32(instr);
45073                                          return;
45074                                        }
45075                                        if (((instr >> 12) & 1) != 0) {
45076                                          UnallocatedA32(instr);
45077                                          return;
45078                                        }
45079                                        unsigned rd =
45080                                            ExtractQRegister(instr, 22, 12);
45081                                        unsigned rm =
45082                                            ExtractDRegister(instr, 5, 0);
45083                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45084                                        uint32_t imm = imm6 - dt.GetSize();
45085                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45086                                        vshll(al,
45087                                              dt,
45088                                              QRegister(rd),
45089                                              DRegister(rm),
45090                                              imm);
45091                                        break;
45092                                      }
45093                                      case 0x000c0000: {
45094                                        // 0xf28c0a10
45095                                        if (((instr & 0x380000) == 0x0) ||
45096                                            ((instr & 0x3f0000) == 0x80000) ||
45097                                            ((instr & 0x3f0000) == 0x100000) ||
45098                                            ((instr & 0x3f0000) == 0x200000)) {
45099                                          UnallocatedA32(instr);
45100                                          return;
45101                                        }
45102                                        DataType dt =
45103                                            Dt_imm6_4_Decode((instr >> 19) &
45104                                                                 0x7,
45105                                                             (instr >> 24) &
45106                                                                 0x1);
45107                                        if (dt.Is(kDataTypeValueInvalid)) {
45108                                          UnallocatedA32(instr);
45109                                          return;
45110                                        }
45111                                        if (((instr >> 12) & 1) != 0) {
45112                                          UnallocatedA32(instr);
45113                                          return;
45114                                        }
45115                                        unsigned rd =
45116                                            ExtractQRegister(instr, 22, 12);
45117                                        unsigned rm =
45118                                            ExtractDRegister(instr, 5, 0);
45119                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45120                                        uint32_t imm = imm6 - dt.GetSize();
45121                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45122                                        vshll(al,
45123                                              dt,
45124                                              QRegister(rd),
45125                                              DRegister(rm),
45126                                              imm);
45127                                        break;
45128                                      }
45129                                      case 0x000d0000: {
45130                                        // 0xf28d0a10
45131                                        if (((instr & 0x380000) == 0x0) ||
45132                                            ((instr & 0x3f0000) == 0x80000) ||
45133                                            ((instr & 0x3f0000) == 0x100000) ||
45134                                            ((instr & 0x3f0000) == 0x200000)) {
45135                                          UnallocatedA32(instr);
45136                                          return;
45137                                        }
45138                                        DataType dt =
45139                                            Dt_imm6_4_Decode((instr >> 19) &
45140                                                                 0x7,
45141                                                             (instr >> 24) &
45142                                                                 0x1);
45143                                        if (dt.Is(kDataTypeValueInvalid)) {
45144                                          UnallocatedA32(instr);
45145                                          return;
45146                                        }
45147                                        if (((instr >> 12) & 1) != 0) {
45148                                          UnallocatedA32(instr);
45149                                          return;
45150                                        }
45151                                        unsigned rd =
45152                                            ExtractQRegister(instr, 22, 12);
45153                                        unsigned rm =
45154                                            ExtractDRegister(instr, 5, 0);
45155                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45156                                        uint32_t imm = imm6 - dt.GetSize();
45157                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45158                                        vshll(al,
45159                                              dt,
45160                                              QRegister(rd),
45161                                              DRegister(rm),
45162                                              imm);
45163                                        break;
45164                                      }
45165                                      case 0x000e0000: {
45166                                        // 0xf28e0a10
45167                                        if (((instr & 0x380000) == 0x0) ||
45168                                            ((instr & 0x3f0000) == 0x80000) ||
45169                                            ((instr & 0x3f0000) == 0x100000) ||
45170                                            ((instr & 0x3f0000) == 0x200000)) {
45171                                          UnallocatedA32(instr);
45172                                          return;
45173                                        }
45174                                        DataType dt =
45175                                            Dt_imm6_4_Decode((instr >> 19) &
45176                                                                 0x7,
45177                                                             (instr >> 24) &
45178                                                                 0x1);
45179                                        if (dt.Is(kDataTypeValueInvalid)) {
45180                                          UnallocatedA32(instr);
45181                                          return;
45182                                        }
45183                                        if (((instr >> 12) & 1) != 0) {
45184                                          UnallocatedA32(instr);
45185                                          return;
45186                                        }
45187                                        unsigned rd =
45188                                            ExtractQRegister(instr, 22, 12);
45189                                        unsigned rm =
45190                                            ExtractDRegister(instr, 5, 0);
45191                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45192                                        uint32_t imm = imm6 - dt.GetSize();
45193                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45194                                        vshll(al,
45195                                              dt,
45196                                              QRegister(rd),
45197                                              DRegister(rm),
45198                                              imm);
45199                                        break;
45200                                      }
45201                                      case 0x000f0000: {
45202                                        // 0xf28f0a10
45203                                        if (((instr & 0x380000) == 0x0) ||
45204                                            ((instr & 0x3f0000) == 0x80000) ||
45205                                            ((instr & 0x3f0000) == 0x100000) ||
45206                                            ((instr & 0x3f0000) == 0x200000)) {
45207                                          UnallocatedA32(instr);
45208                                          return;
45209                                        }
45210                                        DataType dt =
45211                                            Dt_imm6_4_Decode((instr >> 19) &
45212                                                                 0x7,
45213                                                             (instr >> 24) &
45214                                                                 0x1);
45215                                        if (dt.Is(kDataTypeValueInvalid)) {
45216                                          UnallocatedA32(instr);
45217                                          return;
45218                                        }
45219                                        if (((instr >> 12) & 1) != 0) {
45220                                          UnallocatedA32(instr);
45221                                          return;
45222                                        }
45223                                        unsigned rd =
45224                                            ExtractQRegister(instr, 22, 12);
45225                                        unsigned rm =
45226                                            ExtractDRegister(instr, 5, 0);
45227                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45228                                        uint32_t imm = imm6 - dt.GetSize();
45229                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45230                                        vshll(al,
45231                                              dt,
45232                                              QRegister(rd),
45233                                              DRegister(rm),
45234                                              imm);
45235                                        break;
45236                                      }
45237                                      case 0x00100000: {
45238                                        // 0xf2900a10
45239                                        if (((instr & 0x380000) == 0x0) ||
45240                                            ((instr & 0x380000) == 0x180000) ||
45241                                            ((instr & 0x380000) == 0x280000) ||
45242                                            ((instr & 0x380000) == 0x300000) ||
45243                                            ((instr & 0x380000) == 0x380000)) {
45244                                          UnallocatedA32(instr);
45245                                          return;
45246                                        }
45247                                        DataType dt = Dt_U_imm3H_1_Decode(
45248                                            ((instr >> 19) & 0x7) |
45249                                            ((instr >> 21) & 0x8));
45250                                        if (dt.Is(kDataTypeValueInvalid)) {
45251                                          UnallocatedA32(instr);
45252                                          return;
45253                                        }
45254                                        if (((instr >> 12) & 1) != 0) {
45255                                          UnallocatedA32(instr);
45256                                          return;
45257                                        }
45258                                        unsigned rd =
45259                                            ExtractQRegister(instr, 22, 12);
45260                                        unsigned rm =
45261                                            ExtractDRegister(instr, 5, 0);
45262                                        // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
45263                                        vmovl(al,
45264                                              dt,
45265                                              QRegister(rd),
45266                                              DRegister(rm));
45267                                        break;
45268                                      }
45269                                      case 0x00110000: {
45270                                        // 0xf2910a10
45271                                        if (((instr & 0x380000) == 0x0) ||
45272                                            ((instr & 0x3f0000) == 0x80000) ||
45273                                            ((instr & 0x3f0000) == 0x100000) ||
45274                                            ((instr & 0x3f0000) == 0x200000)) {
45275                                          UnallocatedA32(instr);
45276                                          return;
45277                                        }
45278                                        DataType dt =
45279                                            Dt_imm6_4_Decode((instr >> 19) &
45280                                                                 0x7,
45281                                                             (instr >> 24) &
45282                                                                 0x1);
45283                                        if (dt.Is(kDataTypeValueInvalid)) {
45284                                          UnallocatedA32(instr);
45285                                          return;
45286                                        }
45287                                        if (((instr >> 12) & 1) != 0) {
45288                                          UnallocatedA32(instr);
45289                                          return;
45290                                        }
45291                                        unsigned rd =
45292                                            ExtractQRegister(instr, 22, 12);
45293                                        unsigned rm =
45294                                            ExtractDRegister(instr, 5, 0);
45295                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45296                                        uint32_t imm = imm6 - dt.GetSize();
45297                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45298                                        vshll(al,
45299                                              dt,
45300                                              QRegister(rd),
45301                                              DRegister(rm),
45302                                              imm);
45303                                        break;
45304                                      }
45305                                      case 0x00120000: {
45306                                        // 0xf2920a10
45307                                        if (((instr & 0x380000) == 0x0) ||
45308                                            ((instr & 0x3f0000) == 0x80000) ||
45309                                            ((instr & 0x3f0000) == 0x100000) ||
45310                                            ((instr & 0x3f0000) == 0x200000)) {
45311                                          UnallocatedA32(instr);
45312                                          return;
45313                                        }
45314                                        DataType dt =
45315                                            Dt_imm6_4_Decode((instr >> 19) &
45316                                                                 0x7,
45317                                                             (instr >> 24) &
45318                                                                 0x1);
45319                                        if (dt.Is(kDataTypeValueInvalid)) {
45320                                          UnallocatedA32(instr);
45321                                          return;
45322                                        }
45323                                        if (((instr >> 12) & 1) != 0) {
45324                                          UnallocatedA32(instr);
45325                                          return;
45326                                        }
45327                                        unsigned rd =
45328                                            ExtractQRegister(instr, 22, 12);
45329                                        unsigned rm =
45330                                            ExtractDRegister(instr, 5, 0);
45331                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45332                                        uint32_t imm = imm6 - dt.GetSize();
45333                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45334                                        vshll(al,
45335                                              dt,
45336                                              QRegister(rd),
45337                                              DRegister(rm),
45338                                              imm);
45339                                        break;
45340                                      }
45341                                      case 0x00130000: {
45342                                        // 0xf2930a10
45343                                        if (((instr & 0x380000) == 0x0) ||
45344                                            ((instr & 0x3f0000) == 0x80000) ||
45345                                            ((instr & 0x3f0000) == 0x100000) ||
45346                                            ((instr & 0x3f0000) == 0x200000)) {
45347                                          UnallocatedA32(instr);
45348                                          return;
45349                                        }
45350                                        DataType dt =
45351                                            Dt_imm6_4_Decode((instr >> 19) &
45352                                                                 0x7,
45353                                                             (instr >> 24) &
45354                                                                 0x1);
45355                                        if (dt.Is(kDataTypeValueInvalid)) {
45356                                          UnallocatedA32(instr);
45357                                          return;
45358                                        }
45359                                        if (((instr >> 12) & 1) != 0) {
45360                                          UnallocatedA32(instr);
45361                                          return;
45362                                        }
45363                                        unsigned rd =
45364                                            ExtractQRegister(instr, 22, 12);
45365                                        unsigned rm =
45366                                            ExtractDRegister(instr, 5, 0);
45367                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45368                                        uint32_t imm = imm6 - dt.GetSize();
45369                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45370                                        vshll(al,
45371                                              dt,
45372                                              QRegister(rd),
45373                                              DRegister(rm),
45374                                              imm);
45375                                        break;
45376                                      }
45377                                      case 0x00140000: {
45378                                        // 0xf2940a10
45379                                        if (((instr & 0x380000) == 0x0) ||
45380                                            ((instr & 0x3f0000) == 0x80000) ||
45381                                            ((instr & 0x3f0000) == 0x100000) ||
45382                                            ((instr & 0x3f0000) == 0x200000)) {
45383                                          UnallocatedA32(instr);
45384                                          return;
45385                                        }
45386                                        DataType dt =
45387                                            Dt_imm6_4_Decode((instr >> 19) &
45388                                                                 0x7,
45389                                                             (instr >> 24) &
45390                                                                 0x1);
45391                                        if (dt.Is(kDataTypeValueInvalid)) {
45392                                          UnallocatedA32(instr);
45393                                          return;
45394                                        }
45395                                        if (((instr >> 12) & 1) != 0) {
45396                                          UnallocatedA32(instr);
45397                                          return;
45398                                        }
45399                                        unsigned rd =
45400                                            ExtractQRegister(instr, 22, 12);
45401                                        unsigned rm =
45402                                            ExtractDRegister(instr, 5, 0);
45403                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45404                                        uint32_t imm = imm6 - dt.GetSize();
45405                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45406                                        vshll(al,
45407                                              dt,
45408                                              QRegister(rd),
45409                                              DRegister(rm),
45410                                              imm);
45411                                        break;
45412                                      }
45413                                      case 0x00150000: {
45414                                        // 0xf2950a10
45415                                        if (((instr & 0x380000) == 0x0) ||
45416                                            ((instr & 0x3f0000) == 0x80000) ||
45417                                            ((instr & 0x3f0000) == 0x100000) ||
45418                                            ((instr & 0x3f0000) == 0x200000)) {
45419                                          UnallocatedA32(instr);
45420                                          return;
45421                                        }
45422                                        DataType dt =
45423                                            Dt_imm6_4_Decode((instr >> 19) &
45424                                                                 0x7,
45425                                                             (instr >> 24) &
45426                                                                 0x1);
45427                                        if (dt.Is(kDataTypeValueInvalid)) {
45428                                          UnallocatedA32(instr);
45429                                          return;
45430                                        }
45431                                        if (((instr >> 12) & 1) != 0) {
45432                                          UnallocatedA32(instr);
45433                                          return;
45434                                        }
45435                                        unsigned rd =
45436                                            ExtractQRegister(instr, 22, 12);
45437                                        unsigned rm =
45438                                            ExtractDRegister(instr, 5, 0);
45439                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45440                                        uint32_t imm = imm6 - dt.GetSize();
45441                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45442                                        vshll(al,
45443                                              dt,
45444                                              QRegister(rd),
45445                                              DRegister(rm),
45446                                              imm);
45447                                        break;
45448                                      }
45449                                      case 0x00160000: {
45450                                        // 0xf2960a10
45451                                        if (((instr & 0x380000) == 0x0) ||
45452                                            ((instr & 0x3f0000) == 0x80000) ||
45453                                            ((instr & 0x3f0000) == 0x100000) ||
45454                                            ((instr & 0x3f0000) == 0x200000)) {
45455                                          UnallocatedA32(instr);
45456                                          return;
45457                                        }
45458                                        DataType dt =
45459                                            Dt_imm6_4_Decode((instr >> 19) &
45460                                                                 0x7,
45461                                                             (instr >> 24) &
45462                                                                 0x1);
45463                                        if (dt.Is(kDataTypeValueInvalid)) {
45464                                          UnallocatedA32(instr);
45465                                          return;
45466                                        }
45467                                        if (((instr >> 12) & 1) != 0) {
45468                                          UnallocatedA32(instr);
45469                                          return;
45470                                        }
45471                                        unsigned rd =
45472                                            ExtractQRegister(instr, 22, 12);
45473                                        unsigned rm =
45474                                            ExtractDRegister(instr, 5, 0);
45475                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45476                                        uint32_t imm = imm6 - dt.GetSize();
45477                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45478                                        vshll(al,
45479                                              dt,
45480                                              QRegister(rd),
45481                                              DRegister(rm),
45482                                              imm);
45483                                        break;
45484                                      }
45485                                      case 0x00170000: {
45486                                        // 0xf2970a10
45487                                        if (((instr & 0x380000) == 0x0) ||
45488                                            ((instr & 0x3f0000) == 0x80000) ||
45489                                            ((instr & 0x3f0000) == 0x100000) ||
45490                                            ((instr & 0x3f0000) == 0x200000)) {
45491                                          UnallocatedA32(instr);
45492                                          return;
45493                                        }
45494                                        DataType dt =
45495                                            Dt_imm6_4_Decode((instr >> 19) &
45496                                                                 0x7,
45497                                                             (instr >> 24) &
45498                                                                 0x1);
45499                                        if (dt.Is(kDataTypeValueInvalid)) {
45500                                          UnallocatedA32(instr);
45501                                          return;
45502                                        }
45503                                        if (((instr >> 12) & 1) != 0) {
45504                                          UnallocatedA32(instr);
45505                                          return;
45506                                        }
45507                                        unsigned rd =
45508                                            ExtractQRegister(instr, 22, 12);
45509                                        unsigned rm =
45510                                            ExtractDRegister(instr, 5, 0);
45511                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45512                                        uint32_t imm = imm6 - dt.GetSize();
45513                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45514                                        vshll(al,
45515                                              dt,
45516                                              QRegister(rd),
45517                                              DRegister(rm),
45518                                              imm);
45519                                        break;
45520                                      }
45521                                      case 0x00180000: {
45522                                        // 0xf2980a10
45523                                        if (((instr & 0x380000) == 0x0) ||
45524                                            ((instr & 0x3f0000) == 0x80000) ||
45525                                            ((instr & 0x3f0000) == 0x100000) ||
45526                                            ((instr & 0x3f0000) == 0x200000)) {
45527                                          UnallocatedA32(instr);
45528                                          return;
45529                                        }
45530                                        DataType dt =
45531                                            Dt_imm6_4_Decode((instr >> 19) &
45532                                                                 0x7,
45533                                                             (instr >> 24) &
45534                                                                 0x1);
45535                                        if (dt.Is(kDataTypeValueInvalid)) {
45536                                          UnallocatedA32(instr);
45537                                          return;
45538                                        }
45539                                        if (((instr >> 12) & 1) != 0) {
45540                                          UnallocatedA32(instr);
45541                                          return;
45542                                        }
45543                                        unsigned rd =
45544                                            ExtractQRegister(instr, 22, 12);
45545                                        unsigned rm =
45546                                            ExtractDRegister(instr, 5, 0);
45547                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45548                                        uint32_t imm = imm6 - dt.GetSize();
45549                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45550                                        vshll(al,
45551                                              dt,
45552                                              QRegister(rd),
45553                                              DRegister(rm),
45554                                              imm);
45555                                        break;
45556                                      }
45557                                      case 0x00190000: {
45558                                        // 0xf2990a10
45559                                        if (((instr & 0x380000) == 0x0) ||
45560                                            ((instr & 0x3f0000) == 0x80000) ||
45561                                            ((instr & 0x3f0000) == 0x100000) ||
45562                                            ((instr & 0x3f0000) == 0x200000)) {
45563                                          UnallocatedA32(instr);
45564                                          return;
45565                                        }
45566                                        DataType dt =
45567                                            Dt_imm6_4_Decode((instr >> 19) &
45568                                                                 0x7,
45569                                                             (instr >> 24) &
45570                                                                 0x1);
45571                                        if (dt.Is(kDataTypeValueInvalid)) {
45572                                          UnallocatedA32(instr);
45573                                          return;
45574                                        }
45575                                        if (((instr >> 12) & 1) != 0) {
45576                                          UnallocatedA32(instr);
45577                                          return;
45578                                        }
45579                                        unsigned rd =
45580                                            ExtractQRegister(instr, 22, 12);
45581                                        unsigned rm =
45582                                            ExtractDRegister(instr, 5, 0);
45583                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45584                                        uint32_t imm = imm6 - dt.GetSize();
45585                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45586                                        vshll(al,
45587                                              dt,
45588                                              QRegister(rd),
45589                                              DRegister(rm),
45590                                              imm);
45591                                        break;
45592                                      }
45593                                      case 0x001a0000: {
45594                                        // 0xf29a0a10
45595                                        if (((instr & 0x380000) == 0x0) ||
45596                                            ((instr & 0x3f0000) == 0x80000) ||
45597                                            ((instr & 0x3f0000) == 0x100000) ||
45598                                            ((instr & 0x3f0000) == 0x200000)) {
45599                                          UnallocatedA32(instr);
45600                                          return;
45601                                        }
45602                                        DataType dt =
45603                                            Dt_imm6_4_Decode((instr >> 19) &
45604                                                                 0x7,
45605                                                             (instr >> 24) &
45606                                                                 0x1);
45607                                        if (dt.Is(kDataTypeValueInvalid)) {
45608                                          UnallocatedA32(instr);
45609                                          return;
45610                                        }
45611                                        if (((instr >> 12) & 1) != 0) {
45612                                          UnallocatedA32(instr);
45613                                          return;
45614                                        }
45615                                        unsigned rd =
45616                                            ExtractQRegister(instr, 22, 12);
45617                                        unsigned rm =
45618                                            ExtractDRegister(instr, 5, 0);
45619                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45620                                        uint32_t imm = imm6 - dt.GetSize();
45621                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45622                                        vshll(al,
45623                                              dt,
45624                                              QRegister(rd),
45625                                              DRegister(rm),
45626                                              imm);
45627                                        break;
45628                                      }
45629                                      case 0x001b0000: {
45630                                        // 0xf29b0a10
45631                                        if (((instr & 0x380000) == 0x0) ||
45632                                            ((instr & 0x3f0000) == 0x80000) ||
45633                                            ((instr & 0x3f0000) == 0x100000) ||
45634                                            ((instr & 0x3f0000) == 0x200000)) {
45635                                          UnallocatedA32(instr);
45636                                          return;
45637                                        }
45638                                        DataType dt =
45639                                            Dt_imm6_4_Decode((instr >> 19) &
45640                                                                 0x7,
45641                                                             (instr >> 24) &
45642                                                                 0x1);
45643                                        if (dt.Is(kDataTypeValueInvalid)) {
45644                                          UnallocatedA32(instr);
45645                                          return;
45646                                        }
45647                                        if (((instr >> 12) & 1) != 0) {
45648                                          UnallocatedA32(instr);
45649                                          return;
45650                                        }
45651                                        unsigned rd =
45652                                            ExtractQRegister(instr, 22, 12);
45653                                        unsigned rm =
45654                                            ExtractDRegister(instr, 5, 0);
45655                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45656                                        uint32_t imm = imm6 - dt.GetSize();
45657                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45658                                        vshll(al,
45659                                              dt,
45660                                              QRegister(rd),
45661                                              DRegister(rm),
45662                                              imm);
45663                                        break;
45664                                      }
45665                                      case 0x001c0000: {
45666                                        // 0xf29c0a10
45667                                        if (((instr & 0x380000) == 0x0) ||
45668                                            ((instr & 0x3f0000) == 0x80000) ||
45669                                            ((instr & 0x3f0000) == 0x100000) ||
45670                                            ((instr & 0x3f0000) == 0x200000)) {
45671                                          UnallocatedA32(instr);
45672                                          return;
45673                                        }
45674                                        DataType dt =
45675                                            Dt_imm6_4_Decode((instr >> 19) &
45676                                                                 0x7,
45677                                                             (instr >> 24) &
45678                                                                 0x1);
45679                                        if (dt.Is(kDataTypeValueInvalid)) {
45680                                          UnallocatedA32(instr);
45681                                          return;
45682                                        }
45683                                        if (((instr >> 12) & 1) != 0) {
45684                                          UnallocatedA32(instr);
45685                                          return;
45686                                        }
45687                                        unsigned rd =
45688                                            ExtractQRegister(instr, 22, 12);
45689                                        unsigned rm =
45690                                            ExtractDRegister(instr, 5, 0);
45691                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45692                                        uint32_t imm = imm6 - dt.GetSize();
45693                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45694                                        vshll(al,
45695                                              dt,
45696                                              QRegister(rd),
45697                                              DRegister(rm),
45698                                              imm);
45699                                        break;
45700                                      }
45701                                      case 0x001d0000: {
45702                                        // 0xf29d0a10
45703                                        if (((instr & 0x380000) == 0x0) ||
45704                                            ((instr & 0x3f0000) == 0x80000) ||
45705                                            ((instr & 0x3f0000) == 0x100000) ||
45706                                            ((instr & 0x3f0000) == 0x200000)) {
45707                                          UnallocatedA32(instr);
45708                                          return;
45709                                        }
45710                                        DataType dt =
45711                                            Dt_imm6_4_Decode((instr >> 19) &
45712                                                                 0x7,
45713                                                             (instr >> 24) &
45714                                                                 0x1);
45715                                        if (dt.Is(kDataTypeValueInvalid)) {
45716                                          UnallocatedA32(instr);
45717                                          return;
45718                                        }
45719                                        if (((instr >> 12) & 1) != 0) {
45720                                          UnallocatedA32(instr);
45721                                          return;
45722                                        }
45723                                        unsigned rd =
45724                                            ExtractQRegister(instr, 22, 12);
45725                                        unsigned rm =
45726                                            ExtractDRegister(instr, 5, 0);
45727                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45728                                        uint32_t imm = imm6 - dt.GetSize();
45729                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45730                                        vshll(al,
45731                                              dt,
45732                                              QRegister(rd),
45733                                              DRegister(rm),
45734                                              imm);
45735                                        break;
45736                                      }
45737                                      case 0x001e0000: {
45738                                        // 0xf29e0a10
45739                                        if (((instr & 0x380000) == 0x0) ||
45740                                            ((instr & 0x3f0000) == 0x80000) ||
45741                                            ((instr & 0x3f0000) == 0x100000) ||
45742                                            ((instr & 0x3f0000) == 0x200000)) {
45743                                          UnallocatedA32(instr);
45744                                          return;
45745                                        }
45746                                        DataType dt =
45747                                            Dt_imm6_4_Decode((instr >> 19) &
45748                                                                 0x7,
45749                                                             (instr >> 24) &
45750                                                                 0x1);
45751                                        if (dt.Is(kDataTypeValueInvalid)) {
45752                                          UnallocatedA32(instr);
45753                                          return;
45754                                        }
45755                                        if (((instr >> 12) & 1) != 0) {
45756                                          UnallocatedA32(instr);
45757                                          return;
45758                                        }
45759                                        unsigned rd =
45760                                            ExtractQRegister(instr, 22, 12);
45761                                        unsigned rm =
45762                                            ExtractDRegister(instr, 5, 0);
45763                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45764                                        uint32_t imm = imm6 - dt.GetSize();
45765                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45766                                        vshll(al,
45767                                              dt,
45768                                              QRegister(rd),
45769                                              DRegister(rm),
45770                                              imm);
45771                                        break;
45772                                      }
45773                                      case 0x001f0000: {
45774                                        // 0xf29f0a10
45775                                        if (((instr & 0x380000) == 0x0) ||
45776                                            ((instr & 0x3f0000) == 0x80000) ||
45777                                            ((instr & 0x3f0000) == 0x100000) ||
45778                                            ((instr & 0x3f0000) == 0x200000)) {
45779                                          UnallocatedA32(instr);
45780                                          return;
45781                                        }
45782                                        DataType dt =
45783                                            Dt_imm6_4_Decode((instr >> 19) &
45784                                                                 0x7,
45785                                                             (instr >> 24) &
45786                                                                 0x1);
45787                                        if (dt.Is(kDataTypeValueInvalid)) {
45788                                          UnallocatedA32(instr);
45789                                          return;
45790                                        }
45791                                        if (((instr >> 12) & 1) != 0) {
45792                                          UnallocatedA32(instr);
45793                                          return;
45794                                        }
45795                                        unsigned rd =
45796                                            ExtractQRegister(instr, 22, 12);
45797                                        unsigned rm =
45798                                            ExtractDRegister(instr, 5, 0);
45799                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45800                                        uint32_t imm = imm6 - dt.GetSize();
45801                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45802                                        vshll(al,
45803                                              dt,
45804                                              QRegister(rd),
45805                                              DRegister(rm),
45806                                              imm);
45807                                        break;
45808                                      }
45809                                      case 0x00200000: {
45810                                        // 0xf2a00a10
45811                                        if (((instr & 0x380000) == 0x0) ||
45812                                            ((instr & 0x380000) == 0x180000) ||
45813                                            ((instr & 0x380000) == 0x280000) ||
45814                                            ((instr & 0x380000) == 0x300000) ||
45815                                            ((instr & 0x380000) == 0x380000)) {
45816                                          UnallocatedA32(instr);
45817                                          return;
45818                                        }
45819                                        DataType dt = Dt_U_imm3H_1_Decode(
45820                                            ((instr >> 19) & 0x7) |
45821                                            ((instr >> 21) & 0x8));
45822                                        if (dt.Is(kDataTypeValueInvalid)) {
45823                                          UnallocatedA32(instr);
45824                                          return;
45825                                        }
45826                                        if (((instr >> 12) & 1) != 0) {
45827                                          UnallocatedA32(instr);
45828                                          return;
45829                                        }
45830                                        unsigned rd =
45831                                            ExtractQRegister(instr, 22, 12);
45832                                        unsigned rm =
45833                                            ExtractDRegister(instr, 5, 0);
45834                                        // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
45835                                        vmovl(al,
45836                                              dt,
45837                                              QRegister(rd),
45838                                              DRegister(rm));
45839                                        break;
45840                                      }
45841                                      case 0x00210000: {
45842                                        // 0xf2a10a10
45843                                        if (((instr & 0x380000) == 0x0) ||
45844                                            ((instr & 0x3f0000) == 0x80000) ||
45845                                            ((instr & 0x3f0000) == 0x100000) ||
45846                                            ((instr & 0x3f0000) == 0x200000)) {
45847                                          UnallocatedA32(instr);
45848                                          return;
45849                                        }
45850                                        DataType dt =
45851                                            Dt_imm6_4_Decode((instr >> 19) &
45852                                                                 0x7,
45853                                                             (instr >> 24) &
45854                                                                 0x1);
45855                                        if (dt.Is(kDataTypeValueInvalid)) {
45856                                          UnallocatedA32(instr);
45857                                          return;
45858                                        }
45859                                        if (((instr >> 12) & 1) != 0) {
45860                                          UnallocatedA32(instr);
45861                                          return;
45862                                        }
45863                                        unsigned rd =
45864                                            ExtractQRegister(instr, 22, 12);
45865                                        unsigned rm =
45866                                            ExtractDRegister(instr, 5, 0);
45867                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45868                                        uint32_t imm = imm6 - dt.GetSize();
45869                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45870                                        vshll(al,
45871                                              dt,
45872                                              QRegister(rd),
45873                                              DRegister(rm),
45874                                              imm);
45875                                        break;
45876                                      }
45877                                      case 0x00220000: {
45878                                        // 0xf2a20a10
45879                                        if (((instr & 0x380000) == 0x0) ||
45880                                            ((instr & 0x3f0000) == 0x80000) ||
45881                                            ((instr & 0x3f0000) == 0x100000) ||
45882                                            ((instr & 0x3f0000) == 0x200000)) {
45883                                          UnallocatedA32(instr);
45884                                          return;
45885                                        }
45886                                        DataType dt =
45887                                            Dt_imm6_4_Decode((instr >> 19) &
45888                                                                 0x7,
45889                                                             (instr >> 24) &
45890                                                                 0x1);
45891                                        if (dt.Is(kDataTypeValueInvalid)) {
45892                                          UnallocatedA32(instr);
45893                                          return;
45894                                        }
45895                                        if (((instr >> 12) & 1) != 0) {
45896                                          UnallocatedA32(instr);
45897                                          return;
45898                                        }
45899                                        unsigned rd =
45900                                            ExtractQRegister(instr, 22, 12);
45901                                        unsigned rm =
45902                                            ExtractDRegister(instr, 5, 0);
45903                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45904                                        uint32_t imm = imm6 - dt.GetSize();
45905                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45906                                        vshll(al,
45907                                              dt,
45908                                              QRegister(rd),
45909                                              DRegister(rm),
45910                                              imm);
45911                                        break;
45912                                      }
45913                                      case 0x00230000: {
45914                                        // 0xf2a30a10
45915                                        if (((instr & 0x380000) == 0x0) ||
45916                                            ((instr & 0x3f0000) == 0x80000) ||
45917                                            ((instr & 0x3f0000) == 0x100000) ||
45918                                            ((instr & 0x3f0000) == 0x200000)) {
45919                                          UnallocatedA32(instr);
45920                                          return;
45921                                        }
45922                                        DataType dt =
45923                                            Dt_imm6_4_Decode((instr >> 19) &
45924                                                                 0x7,
45925                                                             (instr >> 24) &
45926                                                                 0x1);
45927                                        if (dt.Is(kDataTypeValueInvalid)) {
45928                                          UnallocatedA32(instr);
45929                                          return;
45930                                        }
45931                                        if (((instr >> 12) & 1) != 0) {
45932                                          UnallocatedA32(instr);
45933                                          return;
45934                                        }
45935                                        unsigned rd =
45936                                            ExtractQRegister(instr, 22, 12);
45937                                        unsigned rm =
45938                                            ExtractDRegister(instr, 5, 0);
45939                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45940                                        uint32_t imm = imm6 - dt.GetSize();
45941                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45942                                        vshll(al,
45943                                              dt,
45944                                              QRegister(rd),
45945                                              DRegister(rm),
45946                                              imm);
45947                                        break;
45948                                      }
45949                                      case 0x00240000: {
45950                                        // 0xf2a40a10
45951                                        if (((instr & 0x380000) == 0x0) ||
45952                                            ((instr & 0x3f0000) == 0x80000) ||
45953                                            ((instr & 0x3f0000) == 0x100000) ||
45954                                            ((instr & 0x3f0000) == 0x200000)) {
45955                                          UnallocatedA32(instr);
45956                                          return;
45957                                        }
45958                                        DataType dt =
45959                                            Dt_imm6_4_Decode((instr >> 19) &
45960                                                                 0x7,
45961                                                             (instr >> 24) &
45962                                                                 0x1);
45963                                        if (dt.Is(kDataTypeValueInvalid)) {
45964                                          UnallocatedA32(instr);
45965                                          return;
45966                                        }
45967                                        if (((instr >> 12) & 1) != 0) {
45968                                          UnallocatedA32(instr);
45969                                          return;
45970                                        }
45971                                        unsigned rd =
45972                                            ExtractQRegister(instr, 22, 12);
45973                                        unsigned rm =
45974                                            ExtractDRegister(instr, 5, 0);
45975                                        uint32_t imm6 = (instr >> 16) & 0x3f;
45976                                        uint32_t imm = imm6 - dt.GetSize();
45977                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45978                                        vshll(al,
45979                                              dt,
45980                                              QRegister(rd),
45981                                              DRegister(rm),
45982                                              imm);
45983                                        break;
45984                                      }
45985                                      case 0x00250000: {
45986                                        // 0xf2a50a10
45987                                        if (((instr & 0x380000) == 0x0) ||
45988                                            ((instr & 0x3f0000) == 0x80000) ||
45989                                            ((instr & 0x3f0000) == 0x100000) ||
45990                                            ((instr & 0x3f0000) == 0x200000)) {
45991                                          UnallocatedA32(instr);
45992                                          return;
45993                                        }
45994                                        DataType dt =
45995                                            Dt_imm6_4_Decode((instr >> 19) &
45996                                                                 0x7,
45997                                                             (instr >> 24) &
45998                                                                 0x1);
45999                                        if (dt.Is(kDataTypeValueInvalid)) {
46000                                          UnallocatedA32(instr);
46001                                          return;
46002                                        }
46003                                        if (((instr >> 12) & 1) != 0) {
46004                                          UnallocatedA32(instr);
46005                                          return;
46006                                        }
46007                                        unsigned rd =
46008                                            ExtractQRegister(instr, 22, 12);
46009                                        unsigned rm =
46010                                            ExtractDRegister(instr, 5, 0);
46011                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46012                                        uint32_t imm = imm6 - dt.GetSize();
46013                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46014                                        vshll(al,
46015                                              dt,
46016                                              QRegister(rd),
46017                                              DRegister(rm),
46018                                              imm);
46019                                        break;
46020                                      }
46021                                      case 0x00260000: {
46022                                        // 0xf2a60a10
46023                                        if (((instr & 0x380000) == 0x0) ||
46024                                            ((instr & 0x3f0000) == 0x80000) ||
46025                                            ((instr & 0x3f0000) == 0x100000) ||
46026                                            ((instr & 0x3f0000) == 0x200000)) {
46027                                          UnallocatedA32(instr);
46028                                          return;
46029                                        }
46030                                        DataType dt =
46031                                            Dt_imm6_4_Decode((instr >> 19) &
46032                                                                 0x7,
46033                                                             (instr >> 24) &
46034                                                                 0x1);
46035                                        if (dt.Is(kDataTypeValueInvalid)) {
46036                                          UnallocatedA32(instr);
46037                                          return;
46038                                        }
46039                                        if (((instr >> 12) & 1) != 0) {
46040                                          UnallocatedA32(instr);
46041                                          return;
46042                                        }
46043                                        unsigned rd =
46044                                            ExtractQRegister(instr, 22, 12);
46045                                        unsigned rm =
46046                                            ExtractDRegister(instr, 5, 0);
46047                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46048                                        uint32_t imm = imm6 - dt.GetSize();
46049                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46050                                        vshll(al,
46051                                              dt,
46052                                              QRegister(rd),
46053                                              DRegister(rm),
46054                                              imm);
46055                                        break;
46056                                      }
46057                                      case 0x00270000: {
46058                                        // 0xf2a70a10
46059                                        if (((instr & 0x380000) == 0x0) ||
46060                                            ((instr & 0x3f0000) == 0x80000) ||
46061                                            ((instr & 0x3f0000) == 0x100000) ||
46062                                            ((instr & 0x3f0000) == 0x200000)) {
46063                                          UnallocatedA32(instr);
46064                                          return;
46065                                        }
46066                                        DataType dt =
46067                                            Dt_imm6_4_Decode((instr >> 19) &
46068                                                                 0x7,
46069                                                             (instr >> 24) &
46070                                                                 0x1);
46071                                        if (dt.Is(kDataTypeValueInvalid)) {
46072                                          UnallocatedA32(instr);
46073                                          return;
46074                                        }
46075                                        if (((instr >> 12) & 1) != 0) {
46076                                          UnallocatedA32(instr);
46077                                          return;
46078                                        }
46079                                        unsigned rd =
46080                                            ExtractQRegister(instr, 22, 12);
46081                                        unsigned rm =
46082                                            ExtractDRegister(instr, 5, 0);
46083                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46084                                        uint32_t imm = imm6 - dt.GetSize();
46085                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46086                                        vshll(al,
46087                                              dt,
46088                                              QRegister(rd),
46089                                              DRegister(rm),
46090                                              imm);
46091                                        break;
46092                                      }
46093                                      case 0x00280000: {
46094                                        // 0xf2a80a10
46095                                        if (((instr & 0x380000) == 0x0) ||
46096                                            ((instr & 0x3f0000) == 0x80000) ||
46097                                            ((instr & 0x3f0000) == 0x100000) ||
46098                                            ((instr & 0x3f0000) == 0x200000)) {
46099                                          UnallocatedA32(instr);
46100                                          return;
46101                                        }
46102                                        DataType dt =
46103                                            Dt_imm6_4_Decode((instr >> 19) &
46104                                                                 0x7,
46105                                                             (instr >> 24) &
46106                                                                 0x1);
46107                                        if (dt.Is(kDataTypeValueInvalid)) {
46108                                          UnallocatedA32(instr);
46109                                          return;
46110                                        }
46111                                        if (((instr >> 12) & 1) != 0) {
46112                                          UnallocatedA32(instr);
46113                                          return;
46114                                        }
46115                                        unsigned rd =
46116                                            ExtractQRegister(instr, 22, 12);
46117                                        unsigned rm =
46118                                            ExtractDRegister(instr, 5, 0);
46119                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46120                                        uint32_t imm = imm6 - dt.GetSize();
46121                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46122                                        vshll(al,
46123                                              dt,
46124                                              QRegister(rd),
46125                                              DRegister(rm),
46126                                              imm);
46127                                        break;
46128                                      }
46129                                      case 0x00290000: {
46130                                        // 0xf2a90a10
46131                                        if (((instr & 0x380000) == 0x0) ||
46132                                            ((instr & 0x3f0000) == 0x80000) ||
46133                                            ((instr & 0x3f0000) == 0x100000) ||
46134                                            ((instr & 0x3f0000) == 0x200000)) {
46135                                          UnallocatedA32(instr);
46136                                          return;
46137                                        }
46138                                        DataType dt =
46139                                            Dt_imm6_4_Decode((instr >> 19) &
46140                                                                 0x7,
46141                                                             (instr >> 24) &
46142                                                                 0x1);
46143                                        if (dt.Is(kDataTypeValueInvalid)) {
46144                                          UnallocatedA32(instr);
46145                                          return;
46146                                        }
46147                                        if (((instr >> 12) & 1) != 0) {
46148                                          UnallocatedA32(instr);
46149                                          return;
46150                                        }
46151                                        unsigned rd =
46152                                            ExtractQRegister(instr, 22, 12);
46153                                        unsigned rm =
46154                                            ExtractDRegister(instr, 5, 0);
46155                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46156                                        uint32_t imm = imm6 - dt.GetSize();
46157                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46158                                        vshll(al,
46159                                              dt,
46160                                              QRegister(rd),
46161                                              DRegister(rm),
46162                                              imm);
46163                                        break;
46164                                      }
46165                                      case 0x002a0000: {
46166                                        // 0xf2aa0a10
46167                                        if (((instr & 0x380000) == 0x0) ||
46168                                            ((instr & 0x3f0000) == 0x80000) ||
46169                                            ((instr & 0x3f0000) == 0x100000) ||
46170                                            ((instr & 0x3f0000) == 0x200000)) {
46171                                          UnallocatedA32(instr);
46172                                          return;
46173                                        }
46174                                        DataType dt =
46175                                            Dt_imm6_4_Decode((instr >> 19) &
46176                                                                 0x7,
46177                                                             (instr >> 24) &
46178                                                                 0x1);
46179                                        if (dt.Is(kDataTypeValueInvalid)) {
46180                                          UnallocatedA32(instr);
46181                                          return;
46182                                        }
46183                                        if (((instr >> 12) & 1) != 0) {
46184                                          UnallocatedA32(instr);
46185                                          return;
46186                                        }
46187                                        unsigned rd =
46188                                            ExtractQRegister(instr, 22, 12);
46189                                        unsigned rm =
46190                                            ExtractDRegister(instr, 5, 0);
46191                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46192                                        uint32_t imm = imm6 - dt.GetSize();
46193                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46194                                        vshll(al,
46195                                              dt,
46196                                              QRegister(rd),
46197                                              DRegister(rm),
46198                                              imm);
46199                                        break;
46200                                      }
46201                                      case 0x002b0000: {
46202                                        // 0xf2ab0a10
46203                                        if (((instr & 0x380000) == 0x0) ||
46204                                            ((instr & 0x3f0000) == 0x80000) ||
46205                                            ((instr & 0x3f0000) == 0x100000) ||
46206                                            ((instr & 0x3f0000) == 0x200000)) {
46207                                          UnallocatedA32(instr);
46208                                          return;
46209                                        }
46210                                        DataType dt =
46211                                            Dt_imm6_4_Decode((instr >> 19) &
46212                                                                 0x7,
46213                                                             (instr >> 24) &
46214                                                                 0x1);
46215                                        if (dt.Is(kDataTypeValueInvalid)) {
46216                                          UnallocatedA32(instr);
46217                                          return;
46218                                        }
46219                                        if (((instr >> 12) & 1) != 0) {
46220                                          UnallocatedA32(instr);
46221                                          return;
46222                                        }
46223                                        unsigned rd =
46224                                            ExtractQRegister(instr, 22, 12);
46225                                        unsigned rm =
46226                                            ExtractDRegister(instr, 5, 0);
46227                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46228                                        uint32_t imm = imm6 - dt.GetSize();
46229                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46230                                        vshll(al,
46231                                              dt,
46232                                              QRegister(rd),
46233                                              DRegister(rm),
46234                                              imm);
46235                                        break;
46236                                      }
46237                                      case 0x002c0000: {
46238                                        // 0xf2ac0a10
46239                                        if (((instr & 0x380000) == 0x0) ||
46240                                            ((instr & 0x3f0000) == 0x80000) ||
46241                                            ((instr & 0x3f0000) == 0x100000) ||
46242                                            ((instr & 0x3f0000) == 0x200000)) {
46243                                          UnallocatedA32(instr);
46244                                          return;
46245                                        }
46246                                        DataType dt =
46247                                            Dt_imm6_4_Decode((instr >> 19) &
46248                                                                 0x7,
46249                                                             (instr >> 24) &
46250                                                                 0x1);
46251                                        if (dt.Is(kDataTypeValueInvalid)) {
46252                                          UnallocatedA32(instr);
46253                                          return;
46254                                        }
46255                                        if (((instr >> 12) & 1) != 0) {
46256                                          UnallocatedA32(instr);
46257                                          return;
46258                                        }
46259                                        unsigned rd =
46260                                            ExtractQRegister(instr, 22, 12);
46261                                        unsigned rm =
46262                                            ExtractDRegister(instr, 5, 0);
46263                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46264                                        uint32_t imm = imm6 - dt.GetSize();
46265                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46266                                        vshll(al,
46267                                              dt,
46268                                              QRegister(rd),
46269                                              DRegister(rm),
46270                                              imm);
46271                                        break;
46272                                      }
46273                                      case 0x002d0000: {
46274                                        // 0xf2ad0a10
46275                                        if (((instr & 0x380000) == 0x0) ||
46276                                            ((instr & 0x3f0000) == 0x80000) ||
46277                                            ((instr & 0x3f0000) == 0x100000) ||
46278                                            ((instr & 0x3f0000) == 0x200000)) {
46279                                          UnallocatedA32(instr);
46280                                          return;
46281                                        }
46282                                        DataType dt =
46283                                            Dt_imm6_4_Decode((instr >> 19) &
46284                                                                 0x7,
46285                                                             (instr >> 24) &
46286                                                                 0x1);
46287                                        if (dt.Is(kDataTypeValueInvalid)) {
46288                                          UnallocatedA32(instr);
46289                                          return;
46290                                        }
46291                                        if (((instr >> 12) & 1) != 0) {
46292                                          UnallocatedA32(instr);
46293                                          return;
46294                                        }
46295                                        unsigned rd =
46296                                            ExtractQRegister(instr, 22, 12);
46297                                        unsigned rm =
46298                                            ExtractDRegister(instr, 5, 0);
46299                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46300                                        uint32_t imm = imm6 - dt.GetSize();
46301                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46302                                        vshll(al,
46303                                              dt,
46304                                              QRegister(rd),
46305                                              DRegister(rm),
46306                                              imm);
46307                                        break;
46308                                      }
46309                                      case 0x002e0000: {
46310                                        // 0xf2ae0a10
46311                                        if (((instr & 0x380000) == 0x0) ||
46312                                            ((instr & 0x3f0000) == 0x80000) ||
46313                                            ((instr & 0x3f0000) == 0x100000) ||
46314                                            ((instr & 0x3f0000) == 0x200000)) {
46315                                          UnallocatedA32(instr);
46316                                          return;
46317                                        }
46318                                        DataType dt =
46319                                            Dt_imm6_4_Decode((instr >> 19) &
46320                                                                 0x7,
46321                                                             (instr >> 24) &
46322                                                                 0x1);
46323                                        if (dt.Is(kDataTypeValueInvalid)) {
46324                                          UnallocatedA32(instr);
46325                                          return;
46326                                        }
46327                                        if (((instr >> 12) & 1) != 0) {
46328                                          UnallocatedA32(instr);
46329                                          return;
46330                                        }
46331                                        unsigned rd =
46332                                            ExtractQRegister(instr, 22, 12);
46333                                        unsigned rm =
46334                                            ExtractDRegister(instr, 5, 0);
46335                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46336                                        uint32_t imm = imm6 - dt.GetSize();
46337                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46338                                        vshll(al,
46339                                              dt,
46340                                              QRegister(rd),
46341                                              DRegister(rm),
46342                                              imm);
46343                                        break;
46344                                      }
46345                                      case 0x002f0000: {
46346                                        // 0xf2af0a10
46347                                        if (((instr & 0x380000) == 0x0) ||
46348                                            ((instr & 0x3f0000) == 0x80000) ||
46349                                            ((instr & 0x3f0000) == 0x100000) ||
46350                                            ((instr & 0x3f0000) == 0x200000)) {
46351                                          UnallocatedA32(instr);
46352                                          return;
46353                                        }
46354                                        DataType dt =
46355                                            Dt_imm6_4_Decode((instr >> 19) &
46356                                                                 0x7,
46357                                                             (instr >> 24) &
46358                                                                 0x1);
46359                                        if (dt.Is(kDataTypeValueInvalid)) {
46360                                          UnallocatedA32(instr);
46361                                          return;
46362                                        }
46363                                        if (((instr >> 12) & 1) != 0) {
46364                                          UnallocatedA32(instr);
46365                                          return;
46366                                        }
46367                                        unsigned rd =
46368                                            ExtractQRegister(instr, 22, 12);
46369                                        unsigned rm =
46370                                            ExtractDRegister(instr, 5, 0);
46371                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46372                                        uint32_t imm = imm6 - dt.GetSize();
46373                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46374                                        vshll(al,
46375                                              dt,
46376                                              QRegister(rd),
46377                                              DRegister(rm),
46378                                              imm);
46379                                        break;
46380                                      }
46381                                      case 0x00300000: {
46382                                        // 0xf2b00a10
46383                                        if (((instr & 0x380000) == 0x0) ||
46384                                            ((instr & 0x3f0000) == 0x80000) ||
46385                                            ((instr & 0x3f0000) == 0x100000) ||
46386                                            ((instr & 0x3f0000) == 0x200000)) {
46387                                          UnallocatedA32(instr);
46388                                          return;
46389                                        }
46390                                        DataType dt =
46391                                            Dt_imm6_4_Decode((instr >> 19) &
46392                                                                 0x7,
46393                                                             (instr >> 24) &
46394                                                                 0x1);
46395                                        if (dt.Is(kDataTypeValueInvalid)) {
46396                                          UnallocatedA32(instr);
46397                                          return;
46398                                        }
46399                                        if (((instr >> 12) & 1) != 0) {
46400                                          UnallocatedA32(instr);
46401                                          return;
46402                                        }
46403                                        unsigned rd =
46404                                            ExtractQRegister(instr, 22, 12);
46405                                        unsigned rm =
46406                                            ExtractDRegister(instr, 5, 0);
46407                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46408                                        uint32_t imm = imm6 - dt.GetSize();
46409                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46410                                        vshll(al,
46411                                              dt,
46412                                              QRegister(rd),
46413                                              DRegister(rm),
46414                                              imm);
46415                                        break;
46416                                      }
46417                                      case 0x00310000: {
46418                                        // 0xf2b10a10
46419                                        if (((instr & 0x380000) == 0x0) ||
46420                                            ((instr & 0x3f0000) == 0x80000) ||
46421                                            ((instr & 0x3f0000) == 0x100000) ||
46422                                            ((instr & 0x3f0000) == 0x200000)) {
46423                                          UnallocatedA32(instr);
46424                                          return;
46425                                        }
46426                                        DataType dt =
46427                                            Dt_imm6_4_Decode((instr >> 19) &
46428                                                                 0x7,
46429                                                             (instr >> 24) &
46430                                                                 0x1);
46431                                        if (dt.Is(kDataTypeValueInvalid)) {
46432                                          UnallocatedA32(instr);
46433                                          return;
46434                                        }
46435                                        if (((instr >> 12) & 1) != 0) {
46436                                          UnallocatedA32(instr);
46437                                          return;
46438                                        }
46439                                        unsigned rd =
46440                                            ExtractQRegister(instr, 22, 12);
46441                                        unsigned rm =
46442                                            ExtractDRegister(instr, 5, 0);
46443                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46444                                        uint32_t imm = imm6 - dt.GetSize();
46445                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46446                                        vshll(al,
46447                                              dt,
46448                                              QRegister(rd),
46449                                              DRegister(rm),
46450                                              imm);
46451                                        break;
46452                                      }
46453                                      case 0x00320000: {
46454                                        // 0xf2b20a10
46455                                        if (((instr & 0x380000) == 0x0) ||
46456                                            ((instr & 0x3f0000) == 0x80000) ||
46457                                            ((instr & 0x3f0000) == 0x100000) ||
46458                                            ((instr & 0x3f0000) == 0x200000)) {
46459                                          UnallocatedA32(instr);
46460                                          return;
46461                                        }
46462                                        DataType dt =
46463                                            Dt_imm6_4_Decode((instr >> 19) &
46464                                                                 0x7,
46465                                                             (instr >> 24) &
46466                                                                 0x1);
46467                                        if (dt.Is(kDataTypeValueInvalid)) {
46468                                          UnallocatedA32(instr);
46469                                          return;
46470                                        }
46471                                        if (((instr >> 12) & 1) != 0) {
46472                                          UnallocatedA32(instr);
46473                                          return;
46474                                        }
46475                                        unsigned rd =
46476                                            ExtractQRegister(instr, 22, 12);
46477                                        unsigned rm =
46478                                            ExtractDRegister(instr, 5, 0);
46479                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46480                                        uint32_t imm = imm6 - dt.GetSize();
46481                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46482                                        vshll(al,
46483                                              dt,
46484                                              QRegister(rd),
46485                                              DRegister(rm),
46486                                              imm);
46487                                        break;
46488                                      }
46489                                      case 0x00330000: {
46490                                        // 0xf2b30a10
46491                                        if (((instr & 0x380000) == 0x0) ||
46492                                            ((instr & 0x3f0000) == 0x80000) ||
46493                                            ((instr & 0x3f0000) == 0x100000) ||
46494                                            ((instr & 0x3f0000) == 0x200000)) {
46495                                          UnallocatedA32(instr);
46496                                          return;
46497                                        }
46498                                        DataType dt =
46499                                            Dt_imm6_4_Decode((instr >> 19) &
46500                                                                 0x7,
46501                                                             (instr >> 24) &
46502                                                                 0x1);
46503                                        if (dt.Is(kDataTypeValueInvalid)) {
46504                                          UnallocatedA32(instr);
46505                                          return;
46506                                        }
46507                                        if (((instr >> 12) & 1) != 0) {
46508                                          UnallocatedA32(instr);
46509                                          return;
46510                                        }
46511                                        unsigned rd =
46512                                            ExtractQRegister(instr, 22, 12);
46513                                        unsigned rm =
46514                                            ExtractDRegister(instr, 5, 0);
46515                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46516                                        uint32_t imm = imm6 - dt.GetSize();
46517                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46518                                        vshll(al,
46519                                              dt,
46520                                              QRegister(rd),
46521                                              DRegister(rm),
46522                                              imm);
46523                                        break;
46524                                      }
46525                                      case 0x00340000: {
46526                                        // 0xf2b40a10
46527                                        if (((instr & 0x380000) == 0x0) ||
46528                                            ((instr & 0x3f0000) == 0x80000) ||
46529                                            ((instr & 0x3f0000) == 0x100000) ||
46530                                            ((instr & 0x3f0000) == 0x200000)) {
46531                                          UnallocatedA32(instr);
46532                                          return;
46533                                        }
46534                                        DataType dt =
46535                                            Dt_imm6_4_Decode((instr >> 19) &
46536                                                                 0x7,
46537                                                             (instr >> 24) &
46538                                                                 0x1);
46539                                        if (dt.Is(kDataTypeValueInvalid)) {
46540                                          UnallocatedA32(instr);
46541                                          return;
46542                                        }
46543                                        if (((instr >> 12) & 1) != 0) {
46544                                          UnallocatedA32(instr);
46545                                          return;
46546                                        }
46547                                        unsigned rd =
46548                                            ExtractQRegister(instr, 22, 12);
46549                                        unsigned rm =
46550                                            ExtractDRegister(instr, 5, 0);
46551                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46552                                        uint32_t imm = imm6 - dt.GetSize();
46553                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46554                                        vshll(al,
46555                                              dt,
46556                                              QRegister(rd),
46557                                              DRegister(rm),
46558                                              imm);
46559                                        break;
46560                                      }
46561                                      case 0x00350000: {
46562                                        // 0xf2b50a10
46563                                        if (((instr & 0x380000) == 0x0) ||
46564                                            ((instr & 0x3f0000) == 0x80000) ||
46565                                            ((instr & 0x3f0000) == 0x100000) ||
46566                                            ((instr & 0x3f0000) == 0x200000)) {
46567                                          UnallocatedA32(instr);
46568                                          return;
46569                                        }
46570                                        DataType dt =
46571                                            Dt_imm6_4_Decode((instr >> 19) &
46572                                                                 0x7,
46573                                                             (instr >> 24) &
46574                                                                 0x1);
46575                                        if (dt.Is(kDataTypeValueInvalid)) {
46576                                          UnallocatedA32(instr);
46577                                          return;
46578                                        }
46579                                        if (((instr >> 12) & 1) != 0) {
46580                                          UnallocatedA32(instr);
46581                                          return;
46582                                        }
46583                                        unsigned rd =
46584                                            ExtractQRegister(instr, 22, 12);
46585                                        unsigned rm =
46586                                            ExtractDRegister(instr, 5, 0);
46587                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46588                                        uint32_t imm = imm6 - dt.GetSize();
46589                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46590                                        vshll(al,
46591                                              dt,
46592                                              QRegister(rd),
46593                                              DRegister(rm),
46594                                              imm);
46595                                        break;
46596                                      }
46597                                      case 0x00360000: {
46598                                        // 0xf2b60a10
46599                                        if (((instr & 0x380000) == 0x0) ||
46600                                            ((instr & 0x3f0000) == 0x80000) ||
46601                                            ((instr & 0x3f0000) == 0x100000) ||
46602                                            ((instr & 0x3f0000) == 0x200000)) {
46603                                          UnallocatedA32(instr);
46604                                          return;
46605                                        }
46606                                        DataType dt =
46607                                            Dt_imm6_4_Decode((instr >> 19) &
46608                                                                 0x7,
46609                                                             (instr >> 24) &
46610                                                                 0x1);
46611                                        if (dt.Is(kDataTypeValueInvalid)) {
46612                                          UnallocatedA32(instr);
46613                                          return;
46614                                        }
46615                                        if (((instr >> 12) & 1) != 0) {
46616                                          UnallocatedA32(instr);
46617                                          return;
46618                                        }
46619                                        unsigned rd =
46620                                            ExtractQRegister(instr, 22, 12);
46621                                        unsigned rm =
46622                                            ExtractDRegister(instr, 5, 0);
46623                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46624                                        uint32_t imm = imm6 - dt.GetSize();
46625                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46626                                        vshll(al,
46627                                              dt,
46628                                              QRegister(rd),
46629                                              DRegister(rm),
46630                                              imm);
46631                                        break;
46632                                      }
46633                                      case 0x00370000: {
46634                                        // 0xf2b70a10
46635                                        if (((instr & 0x380000) == 0x0) ||
46636                                            ((instr & 0x3f0000) == 0x80000) ||
46637                                            ((instr & 0x3f0000) == 0x100000) ||
46638                                            ((instr & 0x3f0000) == 0x200000)) {
46639                                          UnallocatedA32(instr);
46640                                          return;
46641                                        }
46642                                        DataType dt =
46643                                            Dt_imm6_4_Decode((instr >> 19) &
46644                                                                 0x7,
46645                                                             (instr >> 24) &
46646                                                                 0x1);
46647                                        if (dt.Is(kDataTypeValueInvalid)) {
46648                                          UnallocatedA32(instr);
46649                                          return;
46650                                        }
46651                                        if (((instr >> 12) & 1) != 0) {
46652                                          UnallocatedA32(instr);
46653                                          return;
46654                                        }
46655                                        unsigned rd =
46656                                            ExtractQRegister(instr, 22, 12);
46657                                        unsigned rm =
46658                                            ExtractDRegister(instr, 5, 0);
46659                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46660                                        uint32_t imm = imm6 - dt.GetSize();
46661                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46662                                        vshll(al,
46663                                              dt,
46664                                              QRegister(rd),
46665                                              DRegister(rm),
46666                                              imm);
46667                                        break;
46668                                      }
46669                                      case 0x00380000: {
46670                                        // 0xf2b80a10
46671                                        if (((instr & 0x380000) == 0x0) ||
46672                                            ((instr & 0x3f0000) == 0x80000) ||
46673                                            ((instr & 0x3f0000) == 0x100000) ||
46674                                            ((instr & 0x3f0000) == 0x200000)) {
46675                                          UnallocatedA32(instr);
46676                                          return;
46677                                        }
46678                                        DataType dt =
46679                                            Dt_imm6_4_Decode((instr >> 19) &
46680                                                                 0x7,
46681                                                             (instr >> 24) &
46682                                                                 0x1);
46683                                        if (dt.Is(kDataTypeValueInvalid)) {
46684                                          UnallocatedA32(instr);
46685                                          return;
46686                                        }
46687                                        if (((instr >> 12) & 1) != 0) {
46688                                          UnallocatedA32(instr);
46689                                          return;
46690                                        }
46691                                        unsigned rd =
46692                                            ExtractQRegister(instr, 22, 12);
46693                                        unsigned rm =
46694                                            ExtractDRegister(instr, 5, 0);
46695                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46696                                        uint32_t imm = imm6 - dt.GetSize();
46697                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46698                                        vshll(al,
46699                                              dt,
46700                                              QRegister(rd),
46701                                              DRegister(rm),
46702                                              imm);
46703                                        break;
46704                                      }
46705                                      case 0x00390000: {
46706                                        // 0xf2b90a10
46707                                        if (((instr & 0x380000) == 0x0) ||
46708                                            ((instr & 0x3f0000) == 0x80000) ||
46709                                            ((instr & 0x3f0000) == 0x100000) ||
46710                                            ((instr & 0x3f0000) == 0x200000)) {
46711                                          UnallocatedA32(instr);
46712                                          return;
46713                                        }
46714                                        DataType dt =
46715                                            Dt_imm6_4_Decode((instr >> 19) &
46716                                                                 0x7,
46717                                                             (instr >> 24) &
46718                                                                 0x1);
46719                                        if (dt.Is(kDataTypeValueInvalid)) {
46720                                          UnallocatedA32(instr);
46721                                          return;
46722                                        }
46723                                        if (((instr >> 12) & 1) != 0) {
46724                                          UnallocatedA32(instr);
46725                                          return;
46726                                        }
46727                                        unsigned rd =
46728                                            ExtractQRegister(instr, 22, 12);
46729                                        unsigned rm =
46730                                            ExtractDRegister(instr, 5, 0);
46731                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46732                                        uint32_t imm = imm6 - dt.GetSize();
46733                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46734                                        vshll(al,
46735                                              dt,
46736                                              QRegister(rd),
46737                                              DRegister(rm),
46738                                              imm);
46739                                        break;
46740                                      }
46741                                      case 0x003a0000: {
46742                                        // 0xf2ba0a10
46743                                        if (((instr & 0x380000) == 0x0) ||
46744                                            ((instr & 0x3f0000) == 0x80000) ||
46745                                            ((instr & 0x3f0000) == 0x100000) ||
46746                                            ((instr & 0x3f0000) == 0x200000)) {
46747                                          UnallocatedA32(instr);
46748                                          return;
46749                                        }
46750                                        DataType dt =
46751                                            Dt_imm6_4_Decode((instr >> 19) &
46752                                                                 0x7,
46753                                                             (instr >> 24) &
46754                                                                 0x1);
46755                                        if (dt.Is(kDataTypeValueInvalid)) {
46756                                          UnallocatedA32(instr);
46757                                          return;
46758                                        }
46759                                        if (((instr >> 12) & 1) != 0) {
46760                                          UnallocatedA32(instr);
46761                                          return;
46762                                        }
46763                                        unsigned rd =
46764                                            ExtractQRegister(instr, 22, 12);
46765                                        unsigned rm =
46766                                            ExtractDRegister(instr, 5, 0);
46767                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46768                                        uint32_t imm = imm6 - dt.GetSize();
46769                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46770                                        vshll(al,
46771                                              dt,
46772                                              QRegister(rd),
46773                                              DRegister(rm),
46774                                              imm);
46775                                        break;
46776                                      }
46777                                      case 0x003b0000: {
46778                                        // 0xf2bb0a10
46779                                        if (((instr & 0x380000) == 0x0) ||
46780                                            ((instr & 0x3f0000) == 0x80000) ||
46781                                            ((instr & 0x3f0000) == 0x100000) ||
46782                                            ((instr & 0x3f0000) == 0x200000)) {
46783                                          UnallocatedA32(instr);
46784                                          return;
46785                                        }
46786                                        DataType dt =
46787                                            Dt_imm6_4_Decode((instr >> 19) &
46788                                                                 0x7,
46789                                                             (instr >> 24) &
46790                                                                 0x1);
46791                                        if (dt.Is(kDataTypeValueInvalid)) {
46792                                          UnallocatedA32(instr);
46793                                          return;
46794                                        }
46795                                        if (((instr >> 12) & 1) != 0) {
46796                                          UnallocatedA32(instr);
46797                                          return;
46798                                        }
46799                                        unsigned rd =
46800                                            ExtractQRegister(instr, 22, 12);
46801                                        unsigned rm =
46802                                            ExtractDRegister(instr, 5, 0);
46803                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46804                                        uint32_t imm = imm6 - dt.GetSize();
46805                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46806                                        vshll(al,
46807                                              dt,
46808                                              QRegister(rd),
46809                                              DRegister(rm),
46810                                              imm);
46811                                        break;
46812                                      }
46813                                      case 0x003c0000: {
46814                                        // 0xf2bc0a10
46815                                        if (((instr & 0x380000) == 0x0) ||
46816                                            ((instr & 0x3f0000) == 0x80000) ||
46817                                            ((instr & 0x3f0000) == 0x100000) ||
46818                                            ((instr & 0x3f0000) == 0x200000)) {
46819                                          UnallocatedA32(instr);
46820                                          return;
46821                                        }
46822                                        DataType dt =
46823                                            Dt_imm6_4_Decode((instr >> 19) &
46824                                                                 0x7,
46825                                                             (instr >> 24) &
46826                                                                 0x1);
46827                                        if (dt.Is(kDataTypeValueInvalid)) {
46828                                          UnallocatedA32(instr);
46829                                          return;
46830                                        }
46831                                        if (((instr >> 12) & 1) != 0) {
46832                                          UnallocatedA32(instr);
46833                                          return;
46834                                        }
46835                                        unsigned rd =
46836                                            ExtractQRegister(instr, 22, 12);
46837                                        unsigned rm =
46838                                            ExtractDRegister(instr, 5, 0);
46839                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46840                                        uint32_t imm = imm6 - dt.GetSize();
46841                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46842                                        vshll(al,
46843                                              dt,
46844                                              QRegister(rd),
46845                                              DRegister(rm),
46846                                              imm);
46847                                        break;
46848                                      }
46849                                      case 0x003d0000: {
46850                                        // 0xf2bd0a10
46851                                        if (((instr & 0x380000) == 0x0) ||
46852                                            ((instr & 0x3f0000) == 0x80000) ||
46853                                            ((instr & 0x3f0000) == 0x100000) ||
46854                                            ((instr & 0x3f0000) == 0x200000)) {
46855                                          UnallocatedA32(instr);
46856                                          return;
46857                                        }
46858                                        DataType dt =
46859                                            Dt_imm6_4_Decode((instr >> 19) &
46860                                                                 0x7,
46861                                                             (instr >> 24) &
46862                                                                 0x1);
46863                                        if (dt.Is(kDataTypeValueInvalid)) {
46864                                          UnallocatedA32(instr);
46865                                          return;
46866                                        }
46867                                        if (((instr >> 12) & 1) != 0) {
46868                                          UnallocatedA32(instr);
46869                                          return;
46870                                        }
46871                                        unsigned rd =
46872                                            ExtractQRegister(instr, 22, 12);
46873                                        unsigned rm =
46874                                            ExtractDRegister(instr, 5, 0);
46875                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46876                                        uint32_t imm = imm6 - dt.GetSize();
46877                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46878                                        vshll(al,
46879                                              dt,
46880                                              QRegister(rd),
46881                                              DRegister(rm),
46882                                              imm);
46883                                        break;
46884                                      }
46885                                      case 0x003e0000: {
46886                                        // 0xf2be0a10
46887                                        if (((instr & 0x380000) == 0x0) ||
46888                                            ((instr & 0x3f0000) == 0x80000) ||
46889                                            ((instr & 0x3f0000) == 0x100000) ||
46890                                            ((instr & 0x3f0000) == 0x200000)) {
46891                                          UnallocatedA32(instr);
46892                                          return;
46893                                        }
46894                                        DataType dt =
46895                                            Dt_imm6_4_Decode((instr >> 19) &
46896                                                                 0x7,
46897                                                             (instr >> 24) &
46898                                                                 0x1);
46899                                        if (dt.Is(kDataTypeValueInvalid)) {
46900                                          UnallocatedA32(instr);
46901                                          return;
46902                                        }
46903                                        if (((instr >> 12) & 1) != 0) {
46904                                          UnallocatedA32(instr);
46905                                          return;
46906                                        }
46907                                        unsigned rd =
46908                                            ExtractQRegister(instr, 22, 12);
46909                                        unsigned rm =
46910                                            ExtractDRegister(instr, 5, 0);
46911                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46912                                        uint32_t imm = imm6 - dt.GetSize();
46913                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46914                                        vshll(al,
46915                                              dt,
46916                                              QRegister(rd),
46917                                              DRegister(rm),
46918                                              imm);
46919                                        break;
46920                                      }
46921                                      case 0x003f0000: {
46922                                        // 0xf2bf0a10
46923                                        if (((instr & 0x380000) == 0x0) ||
46924                                            ((instr & 0x3f0000) == 0x80000) ||
46925                                            ((instr & 0x3f0000) == 0x100000) ||
46926                                            ((instr & 0x3f0000) == 0x200000)) {
46927                                          UnallocatedA32(instr);
46928                                          return;
46929                                        }
46930                                        DataType dt =
46931                                            Dt_imm6_4_Decode((instr >> 19) &
46932                                                                 0x7,
46933                                                             (instr >> 24) &
46934                                                                 0x1);
46935                                        if (dt.Is(kDataTypeValueInvalid)) {
46936                                          UnallocatedA32(instr);
46937                                          return;
46938                                        }
46939                                        if (((instr >> 12) & 1) != 0) {
46940                                          UnallocatedA32(instr);
46941                                          return;
46942                                        }
46943                                        unsigned rd =
46944                                            ExtractQRegister(instr, 22, 12);
46945                                        unsigned rm =
46946                                            ExtractDRegister(instr, 5, 0);
46947                                        uint32_t imm6 = (instr >> 16) & 0x3f;
46948                                        uint32_t imm = imm6 - dt.GetSize();
46949                                        // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46950                                        vshll(al,
46951                                              dt,
46952                                              QRegister(rd),
46953                                              DRegister(rm),
46954                                              imm);
46955                                        break;
46956                                      }
46957                                      default:
46958                                        UnallocatedA32(instr);
46959                                        break;
46960                                    }
46961                                    break;
46962                                  }
46963                                  default: {
46964                                    if (((instr & 0x380000) == 0x0) ||
46965                                        ((instr & 0x3f0000) == 0x80000) ||
46966                                        ((instr & 0x3f0000) == 0x100000) ||
46967                                        ((instr & 0x3f0000) == 0x200000)) {
46968                                      UnallocatedA32(instr);
46969                                      return;
46970                                    }
46971                                    DataType dt =
46972                                        Dt_imm6_4_Decode((instr >> 19) & 0x7,
46973                                                         (instr >> 24) & 0x1);
46974                                    if (dt.Is(kDataTypeValueInvalid)) {
46975                                      UnallocatedA32(instr);
46976                                      return;
46977                                    }
46978                                    if (((instr >> 12) & 1) != 0) {
46979                                      UnallocatedA32(instr);
46980                                      return;
46981                                    }
46982                                    unsigned rd =
46983                                        ExtractQRegister(instr, 22, 12);
46984                                    unsigned rm = ExtractDRegister(instr, 5, 0);
46985                                    uint32_t imm6 = (instr >> 16) & 0x3f;
46986                                    uint32_t imm = imm6 - dt.GetSize();
46987                                    // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46988                                    vshll(al,
46989                                          dt,
46990                                          QRegister(rd),
46991                                          DRegister(rm),
46992                                          imm);
46993                                    break;
46994                                  }
46995                                }
46996                                break;
46997                              }
46998                              default:
46999                                UnallocatedA32(instr);
47000                                break;
47001                            }
47002                            break;
47003                          }
47004                        }
47005                        break;
47006                      }
47007                      default:
47008                        UnallocatedA32(instr);
47009                        break;
47010                    }
47011                    break;
47012                  }
47013                  case 0x00000c00: {
47014                    // 0xf2800c10
47015                    switch (instr & 0x00000080) {
47016                      case 0x00000000: {
47017                        // 0xf2800c10
47018                        switch (instr & 0x00200000) {
47019                          case 0x00000000: {
47020                            // 0xf2800c10
47021                            switch (instr & 0x00180000) {
47022                              case 0x00000000: {
47023                                // 0xf2800c10
47024                                switch (instr & 0x00000300) {
47025                                  case 0x00000200: {
47026                                    // 0xf2800e10
47027                                    if (((instr & 0x920) == 0x100) ||
47028                                        ((instr & 0x520) == 0x100) ||
47029                                        ((instr & 0x820) == 0x20) ||
47030                                        ((instr & 0x420) == 0x20) ||
47031                                        ((instr & 0x220) == 0x20) ||
47032                                        ((instr & 0x120) == 0x120)) {
47033                                      UnallocatedA32(instr);
47034                                      return;
47035                                    }
47036                                    unsigned cmode = ((instr >> 8) & 0xf) |
47037                                                     ((instr >> 1) & 0x10);
47038                                    DataType dt =
47039                                        ImmediateVmov::DecodeDt(cmode);
47040                                    if (dt.Is(kDataTypeValueInvalid)) {
47041                                      UnallocatedA32(instr);
47042                                      return;
47043                                    }
47044                                    unsigned rd =
47045                                        ExtractDRegister(instr, 22, 12);
47046                                    DOperand imm =
47047                                        ImmediateVmov::DecodeImmediate(
47048                                            cmode,
47049                                            (instr & 0xf) |
47050                                                ((instr >> 12) & 0x70) |
47051                                                ((instr >> 17) & 0x80));
47052                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47053                                    vmov(al, dt, DRegister(rd), imm);
47054                                    break;
47055                                  }
47056                                  case 0x00000300: {
47057                                    // 0xf2800f10
47058                                    if (((instr & 0x920) == 0x100) ||
47059                                        ((instr & 0x520) == 0x100) ||
47060                                        ((instr & 0x820) == 0x20) ||
47061                                        ((instr & 0x420) == 0x20) ||
47062                                        ((instr & 0x220) == 0x20) ||
47063                                        ((instr & 0x120) == 0x120)) {
47064                                      UnallocatedA32(instr);
47065                                      return;
47066                                    }
47067                                    unsigned cmode = ((instr >> 8) & 0xf) |
47068                                                     ((instr >> 1) & 0x10);
47069                                    DataType dt =
47070                                        ImmediateVmov::DecodeDt(cmode);
47071                                    if (dt.Is(kDataTypeValueInvalid)) {
47072                                      UnallocatedA32(instr);
47073                                      return;
47074                                    }
47075                                    unsigned rd =
47076                                        ExtractDRegister(instr, 22, 12);
47077                                    DOperand imm =
47078                                        ImmediateVmov::DecodeImmediate(
47079                                            cmode,
47080                                            (instr & 0xf) |
47081                                                ((instr >> 12) & 0x70) |
47082                                                ((instr >> 17) & 0x80));
47083                                    // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47084                                    vmov(al, dt, DRegister(rd), imm);
47085                                    break;
47086                                  }
47087                                  default: {
47088                                    switch (instr & 0x00000020) {
47089                                      case 0x00000020: {
47090                                        // 0xf2800c30
47091                                        switch (instr & 0x00000f20) {
47092                                          case 0x00000000: {
47093                                            // 0xf2800c10
47094                                            if (((instr & 0x920) == 0x100) ||
47095                                                ((instr & 0x520) == 0x100) ||
47096                                                ((instr & 0x820) == 0x20) ||
47097                                                ((instr & 0x420) == 0x20) ||
47098                                                ((instr & 0x220) == 0x20) ||
47099                                                ((instr & 0x120) == 0x120)) {
47100                                              UnallocatedA32(instr);
47101                                              return;
47102                                            }
47103                                            unsigned cmode =
47104                                                ((instr >> 8) & 0xf) |
47105                                                ((instr >> 1) & 0x10);
47106                                            DataType dt =
47107                                                ImmediateVmov::DecodeDt(cmode);
47108                                            if (dt.Is(kDataTypeValueInvalid)) {
47109                                              UnallocatedA32(instr);
47110                                              return;
47111                                            }
47112                                            unsigned rd =
47113                                                ExtractDRegister(instr, 22, 12);
47114                                            DOperand imm =
47115                                                ImmediateVmov::DecodeImmediate(
47116                                                    cmode,
47117                                                    (instr & 0xf) |
47118                                                        ((instr >> 12) & 0x70) |
47119                                                        ((instr >> 17) & 0x80));
47120                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47121                                            vmov(al, dt, DRegister(rd), imm);
47122                                            break;
47123                                          }
47124                                          case 0x00000020: {
47125                                            // 0xf2800c30
47126                                            if (((instr & 0xd00) == 0x100) ||
47127                                                ((instr & 0xd00) == 0x500) ||
47128                                                ((instr & 0xd00) == 0x900) ||
47129                                                ((instr & 0xe00) == 0xe00)) {
47130                                              UnallocatedA32(instr);
47131                                              return;
47132                                            }
47133                                            unsigned cmode = (instr >> 8) & 0xf;
47134                                            DataType dt =
47135                                                ImmediateVmvn::DecodeDt(cmode);
47136                                            if (dt.Is(kDataTypeValueInvalid)) {
47137                                              UnallocatedA32(instr);
47138                                              return;
47139                                            }
47140                                            unsigned rd =
47141                                                ExtractDRegister(instr, 22, 12);
47142                                            DOperand imm =
47143                                                ImmediateVmvn::DecodeImmediate(
47144                                                    cmode,
47145                                                    (instr & 0xf) |
47146                                                        ((instr >> 12) & 0x70) |
47147                                                        ((instr >> 17) & 0x80));
47148                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47149                                            vmvn(al, dt, DRegister(rd), imm);
47150                                            break;
47151                                          }
47152                                          case 0x00000200: {
47153                                            // 0xf2800e10
47154                                            if (((instr & 0x920) == 0x100) ||
47155                                                ((instr & 0x520) == 0x100) ||
47156                                                ((instr & 0x820) == 0x20) ||
47157                                                ((instr & 0x420) == 0x20) ||
47158                                                ((instr & 0x220) == 0x20) ||
47159                                                ((instr & 0x120) == 0x120)) {
47160                                              UnallocatedA32(instr);
47161                                              return;
47162                                            }
47163                                            unsigned cmode =
47164                                                ((instr >> 8) & 0xf) |
47165                                                ((instr >> 1) & 0x10);
47166                                            DataType dt =
47167                                                ImmediateVmov::DecodeDt(cmode);
47168                                            if (dt.Is(kDataTypeValueInvalid)) {
47169                                              UnallocatedA32(instr);
47170                                              return;
47171                                            }
47172                                            unsigned rd =
47173                                                ExtractDRegister(instr, 22, 12);
47174                                            DOperand imm =
47175                                                ImmediateVmov::DecodeImmediate(
47176                                                    cmode,
47177                                                    (instr & 0xf) |
47178                                                        ((instr >> 12) & 0x70) |
47179                                                        ((instr >> 17) & 0x80));
47180                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47181                                            vmov(al, dt, DRegister(rd), imm);
47182                                            break;
47183                                          }
47184                                          case 0x00000220: {
47185                                            // 0xf2800e30
47186                                            if (((instr & 0xd00) == 0x100) ||
47187                                                ((instr & 0xd00) == 0x500) ||
47188                                                ((instr & 0xd00) == 0x900) ||
47189                                                ((instr & 0xe00) == 0xe00)) {
47190                                              UnallocatedA32(instr);
47191                                              return;
47192                                            }
47193                                            unsigned cmode = (instr >> 8) & 0xf;
47194                                            DataType dt =
47195                                                ImmediateVmvn::DecodeDt(cmode);
47196                                            if (dt.Is(kDataTypeValueInvalid)) {
47197                                              UnallocatedA32(instr);
47198                                              return;
47199                                            }
47200                                            unsigned rd =
47201                                                ExtractDRegister(instr, 22, 12);
47202                                            DOperand imm =
47203                                                ImmediateVmvn::DecodeImmediate(
47204                                                    cmode,
47205                                                    (instr & 0xf) |
47206                                                        ((instr >> 12) & 0x70) |
47207                                                        ((instr >> 17) & 0x80));
47208                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47209                                            vmvn(al, dt, DRegister(rd), imm);
47210                                            break;
47211                                          }
47212                                          case 0x00000400: {
47213                                            // 0xf2800c10
47214                                            if (((instr & 0x920) == 0x100) ||
47215                                                ((instr & 0x520) == 0x100) ||
47216                                                ((instr & 0x820) == 0x20) ||
47217                                                ((instr & 0x420) == 0x20) ||
47218                                                ((instr & 0x220) == 0x20) ||
47219                                                ((instr & 0x120) == 0x120)) {
47220                                              UnallocatedA32(instr);
47221                                              return;
47222                                            }
47223                                            unsigned cmode =
47224                                                ((instr >> 8) & 0xf) |
47225                                                ((instr >> 1) & 0x10);
47226                                            DataType dt =
47227                                                ImmediateVmov::DecodeDt(cmode);
47228                                            if (dt.Is(kDataTypeValueInvalid)) {
47229                                              UnallocatedA32(instr);
47230                                              return;
47231                                            }
47232                                            unsigned rd =
47233                                                ExtractDRegister(instr, 22, 12);
47234                                            DOperand imm =
47235                                                ImmediateVmov::DecodeImmediate(
47236                                                    cmode,
47237                                                    (instr & 0xf) |
47238                                                        ((instr >> 12) & 0x70) |
47239                                                        ((instr >> 17) & 0x80));
47240                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47241                                            vmov(al, dt, DRegister(rd), imm);
47242                                            break;
47243                                          }
47244                                          case 0x00000420: {
47245                                            // 0xf2800c30
47246                                            if (((instr & 0xd00) == 0x100) ||
47247                                                ((instr & 0xd00) == 0x500) ||
47248                                                ((instr & 0xd00) == 0x900) ||
47249                                                ((instr & 0xe00) == 0xe00)) {
47250                                              UnallocatedA32(instr);
47251                                              return;
47252                                            }
47253                                            unsigned cmode = (instr >> 8) & 0xf;
47254                                            DataType dt =
47255                                                ImmediateVmvn::DecodeDt(cmode);
47256                                            if (dt.Is(kDataTypeValueInvalid)) {
47257                                              UnallocatedA32(instr);
47258                                              return;
47259                                            }
47260                                            unsigned rd =
47261                                                ExtractDRegister(instr, 22, 12);
47262                                            DOperand imm =
47263                                                ImmediateVmvn::DecodeImmediate(
47264                                                    cmode,
47265                                                    (instr & 0xf) |
47266                                                        ((instr >> 12) & 0x70) |
47267                                                        ((instr >> 17) & 0x80));
47268                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47269                                            vmvn(al, dt, DRegister(rd), imm);
47270                                            break;
47271                                          }
47272                                          case 0x00000600: {
47273                                            // 0xf2800e10
47274                                            if (((instr & 0x920) == 0x100) ||
47275                                                ((instr & 0x520) == 0x100) ||
47276                                                ((instr & 0x820) == 0x20) ||
47277                                                ((instr & 0x420) == 0x20) ||
47278                                                ((instr & 0x220) == 0x20) ||
47279                                                ((instr & 0x120) == 0x120)) {
47280                                              UnallocatedA32(instr);
47281                                              return;
47282                                            }
47283                                            unsigned cmode =
47284                                                ((instr >> 8) & 0xf) |
47285                                                ((instr >> 1) & 0x10);
47286                                            DataType dt =
47287                                                ImmediateVmov::DecodeDt(cmode);
47288                                            if (dt.Is(kDataTypeValueInvalid)) {
47289                                              UnallocatedA32(instr);
47290                                              return;
47291                                            }
47292                                            unsigned rd =
47293                                                ExtractDRegister(instr, 22, 12);
47294                                            DOperand imm =
47295                                                ImmediateVmov::DecodeImmediate(
47296                                                    cmode,
47297                                                    (instr & 0xf) |
47298                                                        ((instr >> 12) & 0x70) |
47299                                                        ((instr >> 17) & 0x80));
47300                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47301                                            vmov(al, dt, DRegister(rd), imm);
47302                                            break;
47303                                          }
47304                                          case 0x00000620: {
47305                                            // 0xf2800e30
47306                                            if (((instr & 0xd00) == 0x100) ||
47307                                                ((instr & 0xd00) == 0x500) ||
47308                                                ((instr & 0xd00) == 0x900) ||
47309                                                ((instr & 0xe00) == 0xe00)) {
47310                                              UnallocatedA32(instr);
47311                                              return;
47312                                            }
47313                                            unsigned cmode = (instr >> 8) & 0xf;
47314                                            DataType dt =
47315                                                ImmediateVmvn::DecodeDt(cmode);
47316                                            if (dt.Is(kDataTypeValueInvalid)) {
47317                                              UnallocatedA32(instr);
47318                                              return;
47319                                            }
47320                                            unsigned rd =
47321                                                ExtractDRegister(instr, 22, 12);
47322                                            DOperand imm =
47323                                                ImmediateVmvn::DecodeImmediate(
47324                                                    cmode,
47325                                                    (instr & 0xf) |
47326                                                        ((instr >> 12) & 0x70) |
47327                                                        ((instr >> 17) & 0x80));
47328                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47329                                            vmvn(al, dt, DRegister(rd), imm);
47330                                            break;
47331                                          }
47332                                          case 0x00000800: {
47333                                            // 0xf2800c10
47334                                            if (((instr & 0x920) == 0x100) ||
47335                                                ((instr & 0x520) == 0x100) ||
47336                                                ((instr & 0x820) == 0x20) ||
47337                                                ((instr & 0x420) == 0x20) ||
47338                                                ((instr & 0x220) == 0x20) ||
47339                                                ((instr & 0x120) == 0x120)) {
47340                                              UnallocatedA32(instr);
47341                                              return;
47342                                            }
47343                                            unsigned cmode =
47344                                                ((instr >> 8) & 0xf) |
47345                                                ((instr >> 1) & 0x10);
47346                                            DataType dt =
47347                                                ImmediateVmov::DecodeDt(cmode);
47348                                            if (dt.Is(kDataTypeValueInvalid)) {
47349                                              UnallocatedA32(instr);
47350                                              return;
47351                                            }
47352                                            unsigned rd =
47353                                                ExtractDRegister(instr, 22, 12);
47354                                            DOperand imm =
47355                                                ImmediateVmov::DecodeImmediate(
47356                                                    cmode,
47357                                                    (instr & 0xf) |
47358                                                        ((instr >> 12) & 0x70) |
47359                                                        ((instr >> 17) & 0x80));
47360                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47361                                            vmov(al, dt, DRegister(rd), imm);
47362                                            break;
47363                                          }
47364                                          case 0x00000820: {
47365                                            // 0xf2800c30
47366                                            if (((instr & 0xd00) == 0x100) ||
47367                                                ((instr & 0xd00) == 0x500) ||
47368                                                ((instr & 0xd00) == 0x900) ||
47369                                                ((instr & 0xe00) == 0xe00)) {
47370                                              UnallocatedA32(instr);
47371                                              return;
47372                                            }
47373                                            unsigned cmode = (instr >> 8) & 0xf;
47374                                            DataType dt =
47375                                                ImmediateVmvn::DecodeDt(cmode);
47376                                            if (dt.Is(kDataTypeValueInvalid)) {
47377                                              UnallocatedA32(instr);
47378                                              return;
47379                                            }
47380                                            unsigned rd =
47381                                                ExtractDRegister(instr, 22, 12);
47382                                            DOperand imm =
47383                                                ImmediateVmvn::DecodeImmediate(
47384                                                    cmode,
47385                                                    (instr & 0xf) |
47386                                                        ((instr >> 12) & 0x70) |
47387                                                        ((instr >> 17) & 0x80));
47388                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47389                                            vmvn(al, dt, DRegister(rd), imm);
47390                                            break;
47391                                          }
47392                                          case 0x00000a00: {
47393                                            // 0xf2800e10
47394                                            if (((instr & 0x920) == 0x100) ||
47395                                                ((instr & 0x520) == 0x100) ||
47396                                                ((instr & 0x820) == 0x20) ||
47397                                                ((instr & 0x420) == 0x20) ||
47398                                                ((instr & 0x220) == 0x20) ||
47399                                                ((instr & 0x120) == 0x120)) {
47400                                              UnallocatedA32(instr);
47401                                              return;
47402                                            }
47403                                            unsigned cmode =
47404                                                ((instr >> 8) & 0xf) |
47405                                                ((instr >> 1) & 0x10);
47406                                            DataType dt =
47407                                                ImmediateVmov::DecodeDt(cmode);
47408                                            if (dt.Is(kDataTypeValueInvalid)) {
47409                                              UnallocatedA32(instr);
47410                                              return;
47411                                            }
47412                                            unsigned rd =
47413                                                ExtractDRegister(instr, 22, 12);
47414                                            DOperand imm =
47415                                                ImmediateVmov::DecodeImmediate(
47416                                                    cmode,
47417                                                    (instr & 0xf) |
47418                                                        ((instr >> 12) & 0x70) |
47419                                                        ((instr >> 17) & 0x80));
47420                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47421                                            vmov(al, dt, DRegister(rd), imm);
47422                                            break;
47423                                          }
47424                                          case 0x00000a20: {
47425                                            // 0xf2800e30
47426                                            if (((instr & 0xd00) == 0x100) ||
47427                                                ((instr & 0xd00) == 0x500) ||
47428                                                ((instr & 0xd00) == 0x900) ||
47429                                                ((instr & 0xe00) == 0xe00)) {
47430                                              UnallocatedA32(instr);
47431                                              return;
47432                                            }
47433                                            unsigned cmode = (instr >> 8) & 0xf;
47434                                            DataType dt =
47435                                                ImmediateVmvn::DecodeDt(cmode);
47436                                            if (dt.Is(kDataTypeValueInvalid)) {
47437                                              UnallocatedA32(instr);
47438                                              return;
47439                                            }
47440                                            unsigned rd =
47441                                                ExtractDRegister(instr, 22, 12);
47442                                            DOperand imm =
47443                                                ImmediateVmvn::DecodeImmediate(
47444                                                    cmode,
47445                                                    (instr & 0xf) |
47446                                                        ((instr >> 12) & 0x70) |
47447                                                        ((instr >> 17) & 0x80));
47448                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47449                                            vmvn(al, dt, DRegister(rd), imm);
47450                                            break;
47451                                          }
47452                                          case 0x00000c00: {
47453                                            // 0xf2800c10
47454                                            if (((instr & 0x920) == 0x100) ||
47455                                                ((instr & 0x520) == 0x100) ||
47456                                                ((instr & 0x820) == 0x20) ||
47457                                                ((instr & 0x420) == 0x20) ||
47458                                                ((instr & 0x220) == 0x20) ||
47459                                                ((instr & 0x120) == 0x120)) {
47460                                              UnallocatedA32(instr);
47461                                              return;
47462                                            }
47463                                            unsigned cmode =
47464                                                ((instr >> 8) & 0xf) |
47465                                                ((instr >> 1) & 0x10);
47466                                            DataType dt =
47467                                                ImmediateVmov::DecodeDt(cmode);
47468                                            if (dt.Is(kDataTypeValueInvalid)) {
47469                                              UnallocatedA32(instr);
47470                                              return;
47471                                            }
47472                                            unsigned rd =
47473                                                ExtractDRegister(instr, 22, 12);
47474                                            DOperand imm =
47475                                                ImmediateVmov::DecodeImmediate(
47476                                                    cmode,
47477                                                    (instr & 0xf) |
47478                                                        ((instr >> 12) & 0x70) |
47479                                                        ((instr >> 17) & 0x80));
47480                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47481                                            vmov(al, dt, DRegister(rd), imm);
47482                                            break;
47483                                          }
47484                                          case 0x00000c20: {
47485                                            // 0xf2800c30
47486                                            if (((instr & 0xd00) == 0x100) ||
47487                                                ((instr & 0xd00) == 0x500) ||
47488                                                ((instr & 0xd00) == 0x900) ||
47489                                                ((instr & 0xe00) == 0xe00)) {
47490                                              UnallocatedA32(instr);
47491                                              return;
47492                                            }
47493                                            unsigned cmode = (instr >> 8) & 0xf;
47494                                            DataType dt =
47495                                                ImmediateVmvn::DecodeDt(cmode);
47496                                            if (dt.Is(kDataTypeValueInvalid)) {
47497                                              UnallocatedA32(instr);
47498                                              return;
47499                                            }
47500                                            unsigned rd =
47501                                                ExtractDRegister(instr, 22, 12);
47502                                            DOperand imm =
47503                                                ImmediateVmvn::DecodeImmediate(
47504                                                    cmode,
47505                                                    (instr & 0xf) |
47506                                                        ((instr >> 12) & 0x70) |
47507                                                        ((instr >> 17) & 0x80));
47508                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47509                                            vmvn(al, dt, DRegister(rd), imm);
47510                                            break;
47511                                          }
47512                                          case 0x00000d00: {
47513                                            // 0xf2800d10
47514                                            if (((instr & 0x920) == 0x100) ||
47515                                                ((instr & 0x520) == 0x100) ||
47516                                                ((instr & 0x820) == 0x20) ||
47517                                                ((instr & 0x420) == 0x20) ||
47518                                                ((instr & 0x220) == 0x20) ||
47519                                                ((instr & 0x120) == 0x120)) {
47520                                              UnallocatedA32(instr);
47521                                              return;
47522                                            }
47523                                            unsigned cmode =
47524                                                ((instr >> 8) & 0xf) |
47525                                                ((instr >> 1) & 0x10);
47526                                            DataType dt =
47527                                                ImmediateVmov::DecodeDt(cmode);
47528                                            if (dt.Is(kDataTypeValueInvalid)) {
47529                                              UnallocatedA32(instr);
47530                                              return;
47531                                            }
47532                                            unsigned rd =
47533                                                ExtractDRegister(instr, 22, 12);
47534                                            DOperand imm =
47535                                                ImmediateVmov::DecodeImmediate(
47536                                                    cmode,
47537                                                    (instr & 0xf) |
47538                                                        ((instr >> 12) & 0x70) |
47539                                                        ((instr >> 17) & 0x80));
47540                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47541                                            vmov(al, dt, DRegister(rd), imm);
47542                                            break;
47543                                          }
47544                                          case 0x00000d20: {
47545                                            // 0xf2800d30
47546                                            if (((instr & 0xd00) == 0x100) ||
47547                                                ((instr & 0xd00) == 0x500) ||
47548                                                ((instr & 0xd00) == 0x900) ||
47549                                                ((instr & 0xe00) == 0xe00)) {
47550                                              UnallocatedA32(instr);
47551                                              return;
47552                                            }
47553                                            unsigned cmode = (instr >> 8) & 0xf;
47554                                            DataType dt =
47555                                                ImmediateVmvn::DecodeDt(cmode);
47556                                            if (dt.Is(kDataTypeValueInvalid)) {
47557                                              UnallocatedA32(instr);
47558                                              return;
47559                                            }
47560                                            unsigned rd =
47561                                                ExtractDRegister(instr, 22, 12);
47562                                            DOperand imm =
47563                                                ImmediateVmvn::DecodeImmediate(
47564                                                    cmode,
47565                                                    (instr & 0xf) |
47566                                                        ((instr >> 12) & 0x70) |
47567                                                        ((instr >> 17) & 0x80));
47568                                            // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47569                                            vmvn(al, dt, DRegister(rd), imm);
47570                                            break;
47571                                          }
47572                                          case 0x00000e00: {
47573                                            // 0xf2800e10
47574                                            if (((instr & 0x920) == 0x100) ||
47575                                                ((instr & 0x520) == 0x100) ||
47576                                                ((instr & 0x820) == 0x20) ||
47577                                                ((instr & 0x420) == 0x20) ||
47578                                                ((instr & 0x220) == 0x20) ||
47579                                                ((instr & 0x120) == 0x120)) {
47580                                              UnallocatedA32(instr);
47581                                              return;
47582                                            }
47583                                            unsigned cmode =
47584                                                ((instr >> 8) & 0xf) |
47585                                                ((instr >> 1) & 0x10);
47586                                            DataType dt =
47587                                                ImmediateVmov::DecodeDt(cmode);
47588                                            if (dt.Is(kDataTypeValueInvalid)) {
47589                                              UnallocatedA32(instr);
47590                                              return;
47591                                            }
47592                                            unsigned rd =
47593                                                ExtractDRegister(instr, 22, 12);
47594                                            DOperand imm =
47595                                                ImmediateVmov::DecodeImmediate(
47596                                                    cmode,
47597                                                    (instr & 0xf) |
47598                                                        ((instr >> 12) & 0x70) |
47599                                                        ((instr >> 17) & 0x80));
47600                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47601                                            vmov(al, dt, DRegister(rd), imm);
47602                                            break;
47603                                          }
47604                                          case 0x00000e20: {
47605                                            // 0xf2800e30
47606                                            if (((instr & 0x920) == 0x100) ||
47607                                                ((instr & 0x520) == 0x100) ||
47608                                                ((instr & 0x820) == 0x20) ||
47609                                                ((instr & 0x420) == 0x20) ||
47610                                                ((instr & 0x220) == 0x20) ||
47611                                                ((instr & 0x120) == 0x120)) {
47612                                              UnallocatedA32(instr);
47613                                              return;
47614                                            }
47615                                            unsigned cmode =
47616                                                ((instr >> 8) & 0xf) |
47617                                                ((instr >> 1) & 0x10);
47618                                            DataType dt =
47619                                                ImmediateVmov::DecodeDt(cmode);
47620                                            if (dt.Is(kDataTypeValueInvalid)) {
47621                                              UnallocatedA32(instr);
47622                                              return;
47623                                            }
47624                                            unsigned rd =
47625                                                ExtractDRegister(instr, 22, 12);
47626                                            DOperand imm =
47627                                                ImmediateVmov::DecodeImmediate(
47628                                                    cmode,
47629                                                    (instr & 0xf) |
47630                                                        ((instr >> 12) & 0x70) |
47631                                                        ((instr >> 17) & 0x80));
47632                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47633                                            vmov(al, dt, DRegister(rd), imm);
47634                                            break;
47635                                          }
47636                                          case 0x00000f00: {
47637                                            // 0xf2800f10
47638                                            if (((instr & 0x920) == 0x100) ||
47639                                                ((instr & 0x520) == 0x100) ||
47640                                                ((instr & 0x820) == 0x20) ||
47641                                                ((instr & 0x420) == 0x20) ||
47642                                                ((instr & 0x220) == 0x20) ||
47643                                                ((instr & 0x120) == 0x120)) {
47644                                              UnallocatedA32(instr);
47645                                              return;
47646                                            }
47647                                            unsigned cmode =
47648                                                ((instr >> 8) & 0xf) |
47649                                                ((instr >> 1) & 0x10);
47650                                            DataType dt =
47651                                                ImmediateVmov::DecodeDt(cmode);
47652                                            if (dt.Is(kDataTypeValueInvalid)) {
47653                                              UnallocatedA32(instr);
47654                                              return;
47655                                            }
47656                                            unsigned rd =
47657                                                ExtractDRegister(instr, 22, 12);
47658                                            DOperand imm =
47659                                                ImmediateVmov::DecodeImmediate(
47660                                                    cmode,
47661                                                    (instr & 0xf) |
47662                                                        ((instr >> 12) & 0x70) |
47663                                                        ((instr >> 17) & 0x80));
47664                                            // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47665                                            vmov(al, dt, DRegister(rd), imm);
47666                                            break;
47667                                          }
47668                                          default:
47669                                            UnallocatedA32(instr);
47670                                            break;
47671                                        }
47672                                        break;
47673                                      }
47674                                      default: {
47675                                        if (((instr & 0x920) == 0x100) ||
47676                                            ((instr & 0x520) == 0x100) ||
47677                                            ((instr & 0x820) == 0x20) ||
47678                                            ((instr & 0x420) == 0x20) ||
47679                                            ((instr & 0x220) == 0x20) ||
47680                                            ((instr & 0x120) == 0x120)) {
47681                                          UnallocatedA32(instr);
47682                                          return;
47683                                        }
47684                                        unsigned cmode = ((instr >> 8) & 0xf) |
47685                                                         ((instr >> 1) & 0x10);
47686                                        DataType dt =
47687                                            ImmediateVmov::DecodeDt(cmode);
47688                                        if (dt.Is(kDataTypeValueInvalid)) {
47689                                          UnallocatedA32(instr);
47690                                          return;
47691                                        }
47692                                        unsigned rd =
47693                                            ExtractDRegister(instr, 22, 12);
47694                                        DOperand imm =
47695                                            ImmediateVmov::DecodeImmediate(
47696                                                cmode,
47697                                                (instr & 0xf) |
47698                                                    ((instr >> 12) & 0x70) |
47699                                                    ((instr >> 17) & 0x80));
47700                                        // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47701                                        vmov(al, dt, DRegister(rd), imm);
47702                                        break;
47703                                      }
47704                                    }
47705                                    break;
47706                                  }
47707                                }
47708                                break;
47709                              }
47710                              default:
47711                                UnallocatedA32(instr);
47712                                break;
47713                            }
47714                            break;
47715                          }
47716                          default: {
47717                            if ((instr & 0x00000200) == 0x00000200) {
47718                              if (((instr & 0x200000) == 0x0)) {
47719                                UnallocatedA32(instr);
47720                                return;
47721                              }
47722                              DataType dt1 = Dt_op_U_1_Decode1(
47723                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
47724                              if (dt1.Is(kDataTypeValueInvalid)) {
47725                                UnallocatedA32(instr);
47726                                return;
47727                              }
47728                              DataType dt2 = Dt_op_U_1_Decode2(
47729                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
47730                              if (dt2.Is(kDataTypeValueInvalid)) {
47731                                UnallocatedA32(instr);
47732                                return;
47733                              }
47734                              unsigned rd = ExtractDRegister(instr, 22, 12);
47735                              unsigned rm = ExtractDRegister(instr, 5, 0);
47736                              uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
47737                              // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
47738                              vcvt(al,
47739                                   dt1,
47740                                   dt2,
47741                                   DRegister(rd),
47742                                   DRegister(rm),
47743                                   fbits);
47744                            } else {
47745                              UnallocatedA32(instr);
47746                            }
47747                            break;
47748                          }
47749                        }
47750                        break;
47751                      }
47752                      default:
47753                        UnallocatedA32(instr);
47754                        break;
47755                    }
47756                    break;
47757                  }
47758                }
47759                break;
47760              }
47761              case 0x00000040: {
47762                // 0xf2800050
47763                switch (instr & 0x00000c00) {
47764                  case 0x00000000: {
47765                    // 0xf2800050
47766                    switch (instr & 0x00380080) {
47767                      case 0x00000000: {
47768                        // 0xf2800050
47769                        switch (instr & 0x00000100) {
47770                          case 0x00000000: {
47771                            // 0xf2800050
47772                            switch (instr & 0x00000200) {
47773                              default: {
47774                                switch (instr & 0x00000020) {
47775                                  case 0x00000020: {
47776                                    // 0xf2800070
47777                                    if (((instr & 0xd00) == 0x100) ||
47778                                        ((instr & 0xd00) == 0x500) ||
47779                                        ((instr & 0xd00) == 0x900) ||
47780                                        ((instr & 0xe00) == 0xe00)) {
47781                                      UnallocatedA32(instr);
47782                                      return;
47783                                    }
47784                                    unsigned cmode = (instr >> 8) & 0xf;
47785                                    DataType dt =
47786                                        ImmediateVmvn::DecodeDt(cmode);
47787                                    if (dt.Is(kDataTypeValueInvalid)) {
47788                                      UnallocatedA32(instr);
47789                                      return;
47790                                    }
47791                                    if (((instr >> 12) & 1) != 0) {
47792                                      UnallocatedA32(instr);
47793                                      return;
47794                                    }
47795                                    unsigned rd =
47796                                        ExtractQRegister(instr, 22, 12);
47797                                    QOperand imm =
47798                                        ImmediateVmvn::DecodeImmediate(
47799                                            cmode,
47800                                            (instr & 0xf) |
47801                                                ((instr >> 12) & 0x70) |
47802                                                ((instr >> 17) & 0x80));
47803                                    // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
47804                                    vmvn(al, dt, QRegister(rd), imm);
47805                                    break;
47806                                  }
47807                                  default: {
47808                                    if (((instr & 0x920) == 0x100) ||
47809                                        ((instr & 0x520) == 0x100) ||
47810                                        ((instr & 0x820) == 0x20) ||
47811                                        ((instr & 0x420) == 0x20) ||
47812                                        ((instr & 0x220) == 0x20) ||
47813                                        ((instr & 0x120) == 0x120)) {
47814                                      UnallocatedA32(instr);
47815                                      return;
47816                                    }
47817                                    unsigned cmode = ((instr >> 8) & 0xf) |
47818                                                     ((instr >> 1) & 0x10);
47819                                    DataType dt =
47820                                        ImmediateVmov::DecodeDt(cmode);
47821                                    if (dt.Is(kDataTypeValueInvalid)) {
47822                                      UnallocatedA32(instr);
47823                                      return;
47824                                    }
47825                                    if (((instr >> 12) & 1) != 0) {
47826                                      UnallocatedA32(instr);
47827                                      return;
47828                                    }
47829                                    unsigned rd =
47830                                        ExtractQRegister(instr, 22, 12);
47831                                    QOperand imm =
47832                                        ImmediateVmov::DecodeImmediate(
47833                                            cmode,
47834                                            (instr & 0xf) |
47835                                                ((instr >> 12) & 0x70) |
47836                                                ((instr >> 17) & 0x80));
47837                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
47838                                    vmov(al, dt, QRegister(rd), imm);
47839                                    break;
47840                                  }
47841                                }
47842                                break;
47843                              }
47844                            }
47845                            break;
47846                          }
47847                          case 0x00000100: {
47848                            // 0xf2800150
47849                            switch (instr & 0x00000020) {
47850                              case 0x00000000: {
47851                                // 0xf2800150
47852                                if (((instr & 0x100) == 0x0) ||
47853                                    ((instr & 0xc00) == 0xc00)) {
47854                                  UnallocatedA32(instr);
47855                                  return;
47856                                }
47857                                unsigned cmode = (instr >> 8) & 0xf;
47858                                DataType dt = ImmediateVorr::DecodeDt(cmode);
47859                                if (dt.Is(kDataTypeValueInvalid)) {
47860                                  UnallocatedA32(instr);
47861                                  return;
47862                                }
47863                                if (((instr >> 12) & 1) != 0) {
47864                                  UnallocatedA32(instr);
47865                                  return;
47866                                }
47867                                unsigned rd = ExtractQRegister(instr, 22, 12);
47868                                QOperand imm = ImmediateVorr::DecodeImmediate(
47869                                    cmode,
47870                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
47871                                        ((instr >> 17) & 0x80));
47872                                // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
47873                                vorr(al, dt, QRegister(rd), QRegister(rd), imm);
47874                                break;
47875                              }
47876                              case 0x00000020: {
47877                                // 0xf2800170
47878                                if (((instr & 0x100) == 0x0) ||
47879                                    ((instr & 0xc00) == 0xc00)) {
47880                                  UnallocatedA32(instr);
47881                                  return;
47882                                }
47883                                unsigned cmode = (instr >> 8) & 0xf;
47884                                DataType dt = ImmediateVbic::DecodeDt(cmode);
47885                                if (dt.Is(kDataTypeValueInvalid)) {
47886                                  UnallocatedA32(instr);
47887                                  return;
47888                                }
47889                                if (((instr >> 12) & 1) != 0) {
47890                                  UnallocatedA32(instr);
47891                                  return;
47892                                }
47893                                unsigned rd = ExtractQRegister(instr, 22, 12);
47894                                QOperand imm = ImmediateVbic::DecodeImmediate(
47895                                    cmode,
47896                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
47897                                        ((instr >> 17) & 0x80));
47898                                // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
47899                                vbic(al, dt, QRegister(rd), QRegister(rd), imm);
47900                                break;
47901                              }
47902                            }
47903                            break;
47904                          }
47905                        }
47906                        break;
47907                      }
47908                      default: {
47909                        switch (instr & 0x00000300) {
47910                          case 0x00000000: {
47911                            // 0xf2800050
47912                            if (((instr & 0x380080) == 0x0)) {
47913                              UnallocatedA32(instr);
47914                              return;
47915                            }
47916                            DataType dt =
47917                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
47918                                                       ((instr >> 4) & 0x8),
47919                                                   (instr >> 24) & 0x1);
47920                            if (dt.Is(kDataTypeValueInvalid)) {
47921                              UnallocatedA32(instr);
47922                              return;
47923                            }
47924                            if (((instr >> 12) & 1) != 0) {
47925                              UnallocatedA32(instr);
47926                              return;
47927                            }
47928                            unsigned rd = ExtractQRegister(instr, 22, 12);
47929                            if ((instr & 1) != 0) {
47930                              UnallocatedA32(instr);
47931                              return;
47932                            }
47933                            unsigned rm = ExtractQRegister(instr, 5, 0);
47934                            uint32_t imm6 = (instr >> 16) & 0x3f;
47935                            uint32_t imm =
47936                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
47937                                imm6;
47938                            // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47939                            vshr(al, dt, QRegister(rd), QRegister(rm), imm);
47940                            break;
47941                          }
47942                          case 0x00000100: {
47943                            // 0xf2800150
47944                            if (((instr & 0x380080) == 0x0)) {
47945                              UnallocatedA32(instr);
47946                              return;
47947                            }
47948                            DataType dt =
47949                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
47950                                                       ((instr >> 4) & 0x8),
47951                                                   (instr >> 24) & 0x1);
47952                            if (dt.Is(kDataTypeValueInvalid)) {
47953                              UnallocatedA32(instr);
47954                              return;
47955                            }
47956                            if (((instr >> 12) & 1) != 0) {
47957                              UnallocatedA32(instr);
47958                              return;
47959                            }
47960                            unsigned rd = ExtractQRegister(instr, 22, 12);
47961                            if ((instr & 1) != 0) {
47962                              UnallocatedA32(instr);
47963                              return;
47964                            }
47965                            unsigned rm = ExtractQRegister(instr, 5, 0);
47966                            uint32_t imm6 = (instr >> 16) & 0x3f;
47967                            uint32_t imm =
47968                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
47969                                imm6;
47970                            // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47971                            vsra(al, dt, QRegister(rd), QRegister(rm), imm);
47972                            break;
47973                          }
47974                          case 0x00000200: {
47975                            // 0xf2800250
47976                            if (((instr & 0x380080) == 0x0)) {
47977                              UnallocatedA32(instr);
47978                              return;
47979                            }
47980                            DataType dt =
47981                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
47982                                                       ((instr >> 4) & 0x8),
47983                                                   (instr >> 24) & 0x1);
47984                            if (dt.Is(kDataTypeValueInvalid)) {
47985                              UnallocatedA32(instr);
47986                              return;
47987                            }
47988                            if (((instr >> 12) & 1) != 0) {
47989                              UnallocatedA32(instr);
47990                              return;
47991                            }
47992                            unsigned rd = ExtractQRegister(instr, 22, 12);
47993                            if ((instr & 1) != 0) {
47994                              UnallocatedA32(instr);
47995                              return;
47996                            }
47997                            unsigned rm = ExtractQRegister(instr, 5, 0);
47998                            uint32_t imm6 = (instr >> 16) & 0x3f;
47999                            uint32_t imm =
48000                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48001                                imm6;
48002                            // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48003                            vrshr(al, dt, QRegister(rd), QRegister(rm), imm);
48004                            break;
48005                          }
48006                          case 0x00000300: {
48007                            // 0xf2800350
48008                            if (((instr & 0x380080) == 0x0)) {
48009                              UnallocatedA32(instr);
48010                              return;
48011                            }
48012                            DataType dt =
48013                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48014                                                       ((instr >> 4) & 0x8),
48015                                                   (instr >> 24) & 0x1);
48016                            if (dt.Is(kDataTypeValueInvalid)) {
48017                              UnallocatedA32(instr);
48018                              return;
48019                            }
48020                            if (((instr >> 12) & 1) != 0) {
48021                              UnallocatedA32(instr);
48022                              return;
48023                            }
48024                            unsigned rd = ExtractQRegister(instr, 22, 12);
48025                            if ((instr & 1) != 0) {
48026                              UnallocatedA32(instr);
48027                              return;
48028                            }
48029                            unsigned rm = ExtractQRegister(instr, 5, 0);
48030                            uint32_t imm6 = (instr >> 16) & 0x3f;
48031                            uint32_t imm =
48032                                (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48033                                imm6;
48034                            // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48035                            vrsra(al, dt, QRegister(rd), QRegister(rm), imm);
48036                            break;
48037                          }
48038                        }
48039                        break;
48040                      }
48041                    }
48042                    break;
48043                  }
48044                  case 0x00000400: {
48045                    // 0xf2800450
48046                    switch (instr & 0x00380080) {
48047                      case 0x00000000: {
48048                        // 0xf2800450
48049                        switch (instr & 0x00000100) {
48050                          case 0x00000000: {
48051                            // 0xf2800450
48052                            switch (instr & 0x00000200) {
48053                              default: {
48054                                switch (instr & 0x00000020) {
48055                                  case 0x00000020: {
48056                                    // 0xf2800470
48057                                    if (((instr & 0xd00) == 0x100) ||
48058                                        ((instr & 0xd00) == 0x500) ||
48059                                        ((instr & 0xd00) == 0x900) ||
48060                                        ((instr & 0xe00) == 0xe00)) {
48061                                      UnallocatedA32(instr);
48062                                      return;
48063                                    }
48064                                    unsigned cmode = (instr >> 8) & 0xf;
48065                                    DataType dt =
48066                                        ImmediateVmvn::DecodeDt(cmode);
48067                                    if (dt.Is(kDataTypeValueInvalid)) {
48068                                      UnallocatedA32(instr);
48069                                      return;
48070                                    }
48071                                    if (((instr >> 12) & 1) != 0) {
48072                                      UnallocatedA32(instr);
48073                                      return;
48074                                    }
48075                                    unsigned rd =
48076                                        ExtractQRegister(instr, 22, 12);
48077                                    QOperand imm =
48078                                        ImmediateVmvn::DecodeImmediate(
48079                                            cmode,
48080                                            (instr & 0xf) |
48081                                                ((instr >> 12) & 0x70) |
48082                                                ((instr >> 17) & 0x80));
48083                                    // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48084                                    vmvn(al, dt, QRegister(rd), imm);
48085                                    break;
48086                                  }
48087                                  default: {
48088                                    if (((instr & 0x920) == 0x100) ||
48089                                        ((instr & 0x520) == 0x100) ||
48090                                        ((instr & 0x820) == 0x20) ||
48091                                        ((instr & 0x420) == 0x20) ||
48092                                        ((instr & 0x220) == 0x20) ||
48093                                        ((instr & 0x120) == 0x120)) {
48094                                      UnallocatedA32(instr);
48095                                      return;
48096                                    }
48097                                    unsigned cmode = ((instr >> 8) & 0xf) |
48098                                                     ((instr >> 1) & 0x10);
48099                                    DataType dt =
48100                                        ImmediateVmov::DecodeDt(cmode);
48101                                    if (dt.Is(kDataTypeValueInvalid)) {
48102                                      UnallocatedA32(instr);
48103                                      return;
48104                                    }
48105                                    if (((instr >> 12) & 1) != 0) {
48106                                      UnallocatedA32(instr);
48107                                      return;
48108                                    }
48109                                    unsigned rd =
48110                                        ExtractQRegister(instr, 22, 12);
48111                                    QOperand imm =
48112                                        ImmediateVmov::DecodeImmediate(
48113                                            cmode,
48114                                            (instr & 0xf) |
48115                                                ((instr >> 12) & 0x70) |
48116                                                ((instr >> 17) & 0x80));
48117                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48118                                    vmov(al, dt, QRegister(rd), imm);
48119                                    break;
48120                                  }
48121                                }
48122                                break;
48123                              }
48124                            }
48125                            break;
48126                          }
48127                          case 0x00000100: {
48128                            // 0xf2800550
48129                            switch (instr & 0x00000020) {
48130                              case 0x00000000: {
48131                                // 0xf2800550
48132                                if (((instr & 0x100) == 0x0) ||
48133                                    ((instr & 0xc00) == 0xc00)) {
48134                                  UnallocatedA32(instr);
48135                                  return;
48136                                }
48137                                unsigned cmode = (instr >> 8) & 0xf;
48138                                DataType dt = ImmediateVorr::DecodeDt(cmode);
48139                                if (dt.Is(kDataTypeValueInvalid)) {
48140                                  UnallocatedA32(instr);
48141                                  return;
48142                                }
48143                                if (((instr >> 12) & 1) != 0) {
48144                                  UnallocatedA32(instr);
48145                                  return;
48146                                }
48147                                unsigned rd = ExtractQRegister(instr, 22, 12);
48148                                QOperand imm = ImmediateVorr::DecodeImmediate(
48149                                    cmode,
48150                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
48151                                        ((instr >> 17) & 0x80));
48152                                // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48153                                vorr(al, dt, QRegister(rd), QRegister(rd), imm);
48154                                break;
48155                              }
48156                              case 0x00000020: {
48157                                // 0xf2800570
48158                                if (((instr & 0x100) == 0x0) ||
48159                                    ((instr & 0xc00) == 0xc00)) {
48160                                  UnallocatedA32(instr);
48161                                  return;
48162                                }
48163                                unsigned cmode = (instr >> 8) & 0xf;
48164                                DataType dt = ImmediateVbic::DecodeDt(cmode);
48165                                if (dt.Is(kDataTypeValueInvalid)) {
48166                                  UnallocatedA32(instr);
48167                                  return;
48168                                }
48169                                if (((instr >> 12) & 1) != 0) {
48170                                  UnallocatedA32(instr);
48171                                  return;
48172                                }
48173                                unsigned rd = ExtractQRegister(instr, 22, 12);
48174                                QOperand imm = ImmediateVbic::DecodeImmediate(
48175                                    cmode,
48176                                    (instr & 0xf) | ((instr >> 12) & 0x70) |
48177                                        ((instr >> 17) & 0x80));
48178                                // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48179                                vbic(al, dt, QRegister(rd), QRegister(rd), imm);
48180                                break;
48181                              }
48182                            }
48183                            break;
48184                          }
48185                        }
48186                        break;
48187                      }
48188                      default: {
48189                        switch (instr & 0x00000300) {
48190                          case 0x00000000: {
48191                            // 0xf2800450
48192                            if ((instr & 0x01000000) == 0x01000000) {
48193                              if (((instr & 0x380080) == 0x0)) {
48194                                UnallocatedA32(instr);
48195                                return;
48196                              }
48197                              DataType dt = Dt_L_imm6_4_Decode(
48198                                  ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
48199                              if (dt.Is(kDataTypeValueInvalid)) {
48200                                UnallocatedA32(instr);
48201                                return;
48202                              }
48203                              if (((instr >> 12) & 1) != 0) {
48204                                UnallocatedA32(instr);
48205                                return;
48206                              }
48207                              unsigned rd = ExtractQRegister(instr, 22, 12);
48208                              if ((instr & 1) != 0) {
48209                                UnallocatedA32(instr);
48210                                return;
48211                              }
48212                              unsigned rm = ExtractQRegister(instr, 5, 0);
48213                              uint32_t imm6 = (instr >> 16) & 0x3f;
48214                              uint32_t imm =
48215                                  (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48216                                  imm6;
48217                              // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
48218                              vsri(al, dt, QRegister(rd), QRegister(rm), imm);
48219                            } else {
48220                              UnallocatedA32(instr);
48221                            }
48222                            break;
48223                          }
48224                          case 0x00000100: {
48225                            // 0xf2800550
48226                            switch (instr & 0x01000000) {
48227                              case 0x00000000: {
48228                                // 0xf2800550
48229                                if (((instr & 0x380080) == 0x0)) {
48230                                  UnallocatedA32(instr);
48231                                  return;
48232                                }
48233                                DataType dt =
48234                                    Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
48235                                                       ((instr >> 4) & 0x8));
48236                                if (dt.Is(kDataTypeValueInvalid)) {
48237                                  UnallocatedA32(instr);
48238                                  return;
48239                                }
48240                                if (((instr >> 12) & 1) != 0) {
48241                                  UnallocatedA32(instr);
48242                                  return;
48243                                }
48244                                unsigned rd = ExtractQRegister(instr, 22, 12);
48245                                if ((instr & 1) != 0) {
48246                                  UnallocatedA32(instr);
48247                                  return;
48248                                }
48249                                unsigned rm = ExtractQRegister(instr, 5, 0);
48250                                uint32_t imm6 = (instr >> 16) & 0x3f;
48251                                uint32_t imm =
48252                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48253                                // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48254                                vshl(al, dt, QRegister(rd), QRegister(rm), imm);
48255                                break;
48256                              }
48257                              case 0x01000000: {
48258                                // 0xf3800550
48259                                if (((instr & 0x380080) == 0x0)) {
48260                                  UnallocatedA32(instr);
48261                                  return;
48262                                }
48263                                DataType dt =
48264                                    Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
48265                                                       ((instr >> 4) & 0x8));
48266                                if (dt.Is(kDataTypeValueInvalid)) {
48267                                  UnallocatedA32(instr);
48268                                  return;
48269                                }
48270                                if (((instr >> 12) & 1) != 0) {
48271                                  UnallocatedA32(instr);
48272                                  return;
48273                                }
48274                                unsigned rd = ExtractQRegister(instr, 22, 12);
48275                                if ((instr & 1) != 0) {
48276                                  UnallocatedA32(instr);
48277                                  return;
48278                                }
48279                                unsigned rm = ExtractQRegister(instr, 5, 0);
48280                                uint32_t imm6 = (instr >> 16) & 0x3f;
48281                                uint32_t imm =
48282                                    imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48283                                // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
48284                                vsli(al, dt, QRegister(rd), QRegister(rm), imm);
48285                                break;
48286                              }
48287                            }
48288                            break;
48289                          }
48290                          case 0x00000200: {
48291                            // 0xf2800650
48292                            if (((instr & 0x380080) == 0x0)) {
48293                              UnallocatedA32(instr);
48294                              return;
48295                            }
48296                            DataType dt =
48297                                Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
48298                                                       ((instr >> 4) & 0x8),
48299                                                   (instr >> 24) & 0x1);
48300                            if (dt.Is(kDataTypeValueInvalid)) {
48301                              UnallocatedA32(instr);
48302                              return;
48303                            }
48304                            if (((instr >> 12) & 1) != 0) {
48305                              UnallocatedA32(instr);
48306                              return;
48307                            }
48308                            unsigned rd = ExtractQRegister(instr, 22, 12);
48309                            if ((instr & 1) != 0) {
48310                              UnallocatedA32(instr);
48311                              return;
48312                            }
48313                            unsigned rm = ExtractQRegister(instr, 5, 0);
48314                            uint32_t imm6 = (instr >> 16) & 0x3f;
48315                            uint32_t imm =
48316                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48317                            // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48318                            vqshlu(al, dt, QRegister(rd), QRegister(rm), imm);
48319                            break;
48320                          }
48321                          case 0x00000300: {
48322                            // 0xf2800750
48323                            if (((instr & 0x380080) == 0x0)) {
48324                              UnallocatedA32(instr);
48325                              return;
48326                            }
48327                            DataType dt =
48328                                Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48329                                                       ((instr >> 4) & 0x8),
48330                                                   (instr >> 24) & 0x1);
48331                            if (dt.Is(kDataTypeValueInvalid)) {
48332                              UnallocatedA32(instr);
48333                              return;
48334                            }
48335                            if (((instr >> 12) & 1) != 0) {
48336                              UnallocatedA32(instr);
48337                              return;
48338                            }
48339                            unsigned rd = ExtractQRegister(instr, 22, 12);
48340                            if ((instr & 1) != 0) {
48341                              UnallocatedA32(instr);
48342                              return;
48343                            }
48344                            unsigned rm = ExtractQRegister(instr, 5, 0);
48345                            uint32_t imm6 = (instr >> 16) & 0x3f;
48346                            uint32_t imm =
48347                                imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48348                            // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48349                            vqshl(al, dt, QRegister(rd), QRegister(rm), imm);
48350                            break;
48351                          }
48352                        }
48353                        break;
48354                      }
48355                    }
48356                    break;
48357                  }
48358                  case 0x00000800: {
48359                    // 0xf2800850
48360                    switch (instr & 0x00000080) {
48361                      case 0x00000000: {
48362                        // 0xf2800850
48363                        switch (instr & 0x00380000) {
48364                          case 0x00000000: {
48365                            // 0xf2800850
48366                            switch (instr & 0x00000100) {
48367                              case 0x00000000: {
48368                                // 0xf2800850
48369                                switch (instr & 0x00000200) {
48370                                  default: {
48371                                    switch (instr & 0x00000020) {
48372                                      case 0x00000020: {
48373                                        // 0xf2800870
48374                                        if (((instr & 0xd00) == 0x100) ||
48375                                            ((instr & 0xd00) == 0x500) ||
48376                                            ((instr & 0xd00) == 0x900) ||
48377                                            ((instr & 0xe00) == 0xe00)) {
48378                                          UnallocatedA32(instr);
48379                                          return;
48380                                        }
48381                                        unsigned cmode = (instr >> 8) & 0xf;
48382                                        DataType dt =
48383                                            ImmediateVmvn::DecodeDt(cmode);
48384                                        if (dt.Is(kDataTypeValueInvalid)) {
48385                                          UnallocatedA32(instr);
48386                                          return;
48387                                        }
48388                                        if (((instr >> 12) & 1) != 0) {
48389                                          UnallocatedA32(instr);
48390                                          return;
48391                                        }
48392                                        unsigned rd =
48393                                            ExtractQRegister(instr, 22, 12);
48394                                        QOperand imm =
48395                                            ImmediateVmvn::DecodeImmediate(
48396                                                cmode,
48397                                                (instr & 0xf) |
48398                                                    ((instr >> 12) & 0x70) |
48399                                                    ((instr >> 17) & 0x80));
48400                                        // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48401                                        vmvn(al, dt, QRegister(rd), imm);
48402                                        break;
48403                                      }
48404                                      default: {
48405                                        if (((instr & 0x920) == 0x100) ||
48406                                            ((instr & 0x520) == 0x100) ||
48407                                            ((instr & 0x820) == 0x20) ||
48408                                            ((instr & 0x420) == 0x20) ||
48409                                            ((instr & 0x220) == 0x20) ||
48410                                            ((instr & 0x120) == 0x120)) {
48411                                          UnallocatedA32(instr);
48412                                          return;
48413                                        }
48414                                        unsigned cmode = ((instr >> 8) & 0xf) |
48415                                                         ((instr >> 1) & 0x10);
48416                                        DataType dt =
48417                                            ImmediateVmov::DecodeDt(cmode);
48418                                        if (dt.Is(kDataTypeValueInvalid)) {
48419                                          UnallocatedA32(instr);
48420                                          return;
48421                                        }
48422                                        if (((instr >> 12) & 1) != 0) {
48423                                          UnallocatedA32(instr);
48424                                          return;
48425                                        }
48426                                        unsigned rd =
48427                                            ExtractQRegister(instr, 22, 12);
48428                                        QOperand imm =
48429                                            ImmediateVmov::DecodeImmediate(
48430                                                cmode,
48431                                                (instr & 0xf) |
48432                                                    ((instr >> 12) & 0x70) |
48433                                                    ((instr >> 17) & 0x80));
48434                                        // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48435                                        vmov(al, dt, QRegister(rd), imm);
48436                                        break;
48437                                      }
48438                                    }
48439                                    break;
48440                                  }
48441                                }
48442                                break;
48443                              }
48444                              case 0x00000100: {
48445                                // 0xf2800950
48446                                switch (instr & 0x00000020) {
48447                                  case 0x00000000: {
48448                                    // 0xf2800950
48449                                    if (((instr & 0x100) == 0x0) ||
48450                                        ((instr & 0xc00) == 0xc00)) {
48451                                      UnallocatedA32(instr);
48452                                      return;
48453                                    }
48454                                    unsigned cmode = (instr >> 8) & 0xf;
48455                                    DataType dt =
48456                                        ImmediateVorr::DecodeDt(cmode);
48457                                    if (dt.Is(kDataTypeValueInvalid)) {
48458                                      UnallocatedA32(instr);
48459                                      return;
48460                                    }
48461                                    if (((instr >> 12) & 1) != 0) {
48462                                      UnallocatedA32(instr);
48463                                      return;
48464                                    }
48465                                    unsigned rd =
48466                                        ExtractQRegister(instr, 22, 12);
48467                                    QOperand imm =
48468                                        ImmediateVorr::DecodeImmediate(
48469                                            cmode,
48470                                            (instr & 0xf) |
48471                                                ((instr >> 12) & 0x70) |
48472                                                ((instr >> 17) & 0x80));
48473                                    // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48474                                    vorr(al,
48475                                         dt,
48476                                         QRegister(rd),
48477                                         QRegister(rd),
48478                                         imm);
48479                                    break;
48480                                  }
48481                                  case 0x00000020: {
48482                                    // 0xf2800970
48483                                    if (((instr & 0x100) == 0x0) ||
48484                                        ((instr & 0xc00) == 0xc00)) {
48485                                      UnallocatedA32(instr);
48486                                      return;
48487                                    }
48488                                    unsigned cmode = (instr >> 8) & 0xf;
48489                                    DataType dt =
48490                                        ImmediateVbic::DecodeDt(cmode);
48491                                    if (dt.Is(kDataTypeValueInvalid)) {
48492                                      UnallocatedA32(instr);
48493                                      return;
48494                                    }
48495                                    if (((instr >> 12) & 1) != 0) {
48496                                      UnallocatedA32(instr);
48497                                      return;
48498                                    }
48499                                    unsigned rd =
48500                                        ExtractQRegister(instr, 22, 12);
48501                                    QOperand imm =
48502                                        ImmediateVbic::DecodeImmediate(
48503                                            cmode,
48504                                            (instr & 0xf) |
48505                                                ((instr >> 12) & 0x70) |
48506                                                ((instr >> 17) & 0x80));
48507                                    // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48508                                    vbic(al,
48509                                         dt,
48510                                         QRegister(rd),
48511                                         QRegister(rd),
48512                                         imm);
48513                                    break;
48514                                  }
48515                                }
48516                                break;
48517                              }
48518                            }
48519                            break;
48520                          }
48521                          default: {
48522                            switch (instr & 0x00000300) {
48523                              case 0x00000000: {
48524                                // 0xf2800850
48525                                switch (instr & 0x01000000) {
48526                                  case 0x00000000: {
48527                                    // 0xf2800850
48528                                    if (((instr & 0x380000) == 0x0)) {
48529                                      UnallocatedA32(instr);
48530                                      return;
48531                                    }
48532                                    DataType dt =
48533                                        Dt_imm6_3_Decode((instr >> 19) & 0x7);
48534                                    if (dt.Is(kDataTypeValueInvalid)) {
48535                                      UnallocatedA32(instr);
48536                                      return;
48537                                    }
48538                                    unsigned rd =
48539                                        ExtractDRegister(instr, 22, 12);
48540                                    if ((instr & 1) != 0) {
48541                                      UnallocatedA32(instr);
48542                                      return;
48543                                    }
48544                                    unsigned rm = ExtractQRegister(instr, 5, 0);
48545                                    uint32_t imm6 = (instr >> 16) & 0x3f;
48546                                    uint32_t imm = dt.GetSize() - imm6;
48547                                    // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48548                                    vrshrn(al,
48549                                           dt,
48550                                           DRegister(rd),
48551                                           QRegister(rm),
48552                                           imm);
48553                                    break;
48554                                  }
48555                                  case 0x01000000: {
48556                                    // 0xf3800850
48557                                    if (((instr & 0x380000) == 0x0)) {
48558                                      UnallocatedA32(instr);
48559                                      return;
48560                                    }
48561                                    DataType dt =
48562                                        Dt_imm6_2_Decode((instr >> 19) & 0x7,
48563                                                         (instr >> 24) & 0x1);
48564                                    if (dt.Is(kDataTypeValueInvalid)) {
48565                                      UnallocatedA32(instr);
48566                                      return;
48567                                    }
48568                                    unsigned rd =
48569                                        ExtractDRegister(instr, 22, 12);
48570                                    if ((instr & 1) != 0) {
48571                                      UnallocatedA32(instr);
48572                                      return;
48573                                    }
48574                                    unsigned rm = ExtractQRegister(instr, 5, 0);
48575                                    uint32_t imm6 = (instr >> 16) & 0x3f;
48576                                    uint32_t imm = dt.GetSize() - imm6;
48577                                    // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48578                                    vqrshrun(al,
48579                                             dt,
48580                                             DRegister(rd),
48581                                             QRegister(rm),
48582                                             imm);
48583                                    break;
48584                                  }
48585                                }
48586                                break;
48587                              }
48588                              case 0x00000100: {
48589                                // 0xf2800950
48590                                if (((instr & 0x380000) == 0x0)) {
48591                                  UnallocatedA32(instr);
48592                                  return;
48593                                }
48594                                DataType dt =
48595                                    Dt_imm6_1_Decode((instr >> 19) & 0x7,
48596                                                     (instr >> 24) & 0x1);
48597                                if (dt.Is(kDataTypeValueInvalid)) {
48598                                  UnallocatedA32(instr);
48599                                  return;
48600                                }
48601                                unsigned rd = ExtractDRegister(instr, 22, 12);
48602                                if ((instr & 1) != 0) {
48603                                  UnallocatedA32(instr);
48604                                  return;
48605                                }
48606                                unsigned rm = ExtractQRegister(instr, 5, 0);
48607                                uint32_t imm6 = (instr >> 16) & 0x3f;
48608                                uint32_t imm = dt.GetSize() - imm6;
48609                                // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48610                                vqrshrn(al,
48611                                        dt,
48612                                        DRegister(rd),
48613                                        QRegister(rm),
48614                                        imm);
48615                                break;
48616                              }
48617                              default:
48618                                UnallocatedA32(instr);
48619                                break;
48620                            }
48621                            break;
48622                          }
48623                        }
48624                        break;
48625                      }
48626                      default:
48627                        UnallocatedA32(instr);
48628                        break;
48629                    }
48630                    break;
48631                  }
48632                  case 0x00000c00: {
48633                    // 0xf2800c50
48634                    switch (instr & 0x00000080) {
48635                      case 0x00000000: {
48636                        // 0xf2800c50
48637                        switch (instr & 0x00200000) {
48638                          case 0x00000000: {
48639                            // 0xf2800c50
48640                            switch (instr & 0x00180000) {
48641                              case 0x00000000: {
48642                                // 0xf2800c50
48643                                switch (instr & 0x00000300) {
48644                                  case 0x00000200: {
48645                                    // 0xf2800e50
48646                                    if (((instr & 0x920) == 0x100) ||
48647                                        ((instr & 0x520) == 0x100) ||
48648                                        ((instr & 0x820) == 0x20) ||
48649                                        ((instr & 0x420) == 0x20) ||
48650                                        ((instr & 0x220) == 0x20) ||
48651                                        ((instr & 0x120) == 0x120)) {
48652                                      UnallocatedA32(instr);
48653                                      return;
48654                                    }
48655                                    unsigned cmode = ((instr >> 8) & 0xf) |
48656                                                     ((instr >> 1) & 0x10);
48657                                    DataType dt =
48658                                        ImmediateVmov::DecodeDt(cmode);
48659                                    if (dt.Is(kDataTypeValueInvalid)) {
48660                                      UnallocatedA32(instr);
48661                                      return;
48662                                    }
48663                                    if (((instr >> 12) & 1) != 0) {
48664                                      UnallocatedA32(instr);
48665                                      return;
48666                                    }
48667                                    unsigned rd =
48668                                        ExtractQRegister(instr, 22, 12);
48669                                    QOperand imm =
48670                                        ImmediateVmov::DecodeImmediate(
48671                                            cmode,
48672                                            (instr & 0xf) |
48673                                                ((instr >> 12) & 0x70) |
48674                                                ((instr >> 17) & 0x80));
48675                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48676                                    vmov(al, dt, QRegister(rd), imm);
48677                                    break;
48678                                  }
48679                                  case 0x00000300: {
48680                                    // 0xf2800f50
48681                                    if (((instr & 0x920) == 0x100) ||
48682                                        ((instr & 0x520) == 0x100) ||
48683                                        ((instr & 0x820) == 0x20) ||
48684                                        ((instr & 0x420) == 0x20) ||
48685                                        ((instr & 0x220) == 0x20) ||
48686                                        ((instr & 0x120) == 0x120)) {
48687                                      UnallocatedA32(instr);
48688                                      return;
48689                                    }
48690                                    unsigned cmode = ((instr >> 8) & 0xf) |
48691                                                     ((instr >> 1) & 0x10);
48692                                    DataType dt =
48693                                        ImmediateVmov::DecodeDt(cmode);
48694                                    if (dt.Is(kDataTypeValueInvalid)) {
48695                                      UnallocatedA32(instr);
48696                                      return;
48697                                    }
48698                                    if (((instr >> 12) & 1) != 0) {
48699                                      UnallocatedA32(instr);
48700                                      return;
48701                                    }
48702                                    unsigned rd =
48703                                        ExtractQRegister(instr, 22, 12);
48704                                    QOperand imm =
48705                                        ImmediateVmov::DecodeImmediate(
48706                                            cmode,
48707                                            (instr & 0xf) |
48708                                                ((instr >> 12) & 0x70) |
48709                                                ((instr >> 17) & 0x80));
48710                                    // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48711                                    vmov(al, dt, QRegister(rd), imm);
48712                                    break;
48713                                  }
48714                                  default: {
48715                                    switch (instr & 0x00000020) {
48716                                      case 0x00000020: {
48717                                        // 0xf2800c70
48718                                        switch (instr & 0x00000f20) {
48719                                          case 0x00000000: {
48720                                            // 0xf2800c50
48721                                            if (((instr & 0x920) == 0x100) ||
48722                                                ((instr & 0x520) == 0x100) ||
48723                                                ((instr & 0x820) == 0x20) ||
48724                                                ((instr & 0x420) == 0x20) ||
48725                                                ((instr & 0x220) == 0x20) ||
48726                                                ((instr & 0x120) == 0x120)) {
48727                                              UnallocatedA32(instr);
48728                                              return;
48729                                            }
48730                                            unsigned cmode =
48731                                                ((instr >> 8) & 0xf) |
48732                                                ((instr >> 1) & 0x10);
48733                                            DataType dt =
48734                                                ImmediateVmov::DecodeDt(cmode);
48735                                            if (dt.Is(kDataTypeValueInvalid)) {
48736                                              UnallocatedA32(instr);
48737                                              return;
48738                                            }
48739                                            if (((instr >> 12) & 1) != 0) {
48740                                              UnallocatedA32(instr);
48741                                              return;
48742                                            }
48743                                            unsigned rd =
48744                                                ExtractQRegister(instr, 22, 12);
48745                                            QOperand imm =
48746                                                ImmediateVmov::DecodeImmediate(
48747                                                    cmode,
48748                                                    (instr & 0xf) |
48749                                                        ((instr >> 12) & 0x70) |
48750                                                        ((instr >> 17) & 0x80));
48751                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48752                                            vmov(al, dt, QRegister(rd), imm);
48753                                            break;
48754                                          }
48755                                          case 0x00000020: {
48756                                            // 0xf2800c70
48757                                            if (((instr & 0xd00) == 0x100) ||
48758                                                ((instr & 0xd00) == 0x500) ||
48759                                                ((instr & 0xd00) == 0x900) ||
48760                                                ((instr & 0xe00) == 0xe00)) {
48761                                              UnallocatedA32(instr);
48762                                              return;
48763                                            }
48764                                            unsigned cmode = (instr >> 8) & 0xf;
48765                                            DataType dt =
48766                                                ImmediateVmvn::DecodeDt(cmode);
48767                                            if (dt.Is(kDataTypeValueInvalid)) {
48768                                              UnallocatedA32(instr);
48769                                              return;
48770                                            }
48771                                            if (((instr >> 12) & 1) != 0) {
48772                                              UnallocatedA32(instr);
48773                                              return;
48774                                            }
48775                                            unsigned rd =
48776                                                ExtractQRegister(instr, 22, 12);
48777                                            QOperand imm =
48778                                                ImmediateVmvn::DecodeImmediate(
48779                                                    cmode,
48780                                                    (instr & 0xf) |
48781                                                        ((instr >> 12) & 0x70) |
48782                                                        ((instr >> 17) & 0x80));
48783                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48784                                            vmvn(al, dt, QRegister(rd), imm);
48785                                            break;
48786                                          }
48787                                          case 0x00000200: {
48788                                            // 0xf2800e50
48789                                            if (((instr & 0x920) == 0x100) ||
48790                                                ((instr & 0x520) == 0x100) ||
48791                                                ((instr & 0x820) == 0x20) ||
48792                                                ((instr & 0x420) == 0x20) ||
48793                                                ((instr & 0x220) == 0x20) ||
48794                                                ((instr & 0x120) == 0x120)) {
48795                                              UnallocatedA32(instr);
48796                                              return;
48797                                            }
48798                                            unsigned cmode =
48799                                                ((instr >> 8) & 0xf) |
48800                                                ((instr >> 1) & 0x10);
48801                                            DataType dt =
48802                                                ImmediateVmov::DecodeDt(cmode);
48803                                            if (dt.Is(kDataTypeValueInvalid)) {
48804                                              UnallocatedA32(instr);
48805                                              return;
48806                                            }
48807                                            if (((instr >> 12) & 1) != 0) {
48808                                              UnallocatedA32(instr);
48809                                              return;
48810                                            }
48811                                            unsigned rd =
48812                                                ExtractQRegister(instr, 22, 12);
48813                                            QOperand imm =
48814                                                ImmediateVmov::DecodeImmediate(
48815                                                    cmode,
48816                                                    (instr & 0xf) |
48817                                                        ((instr >> 12) & 0x70) |
48818                                                        ((instr >> 17) & 0x80));
48819                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48820                                            vmov(al, dt, QRegister(rd), imm);
48821                                            break;
48822                                          }
48823                                          case 0x00000220: {
48824                                            // 0xf2800e70
48825                                            if (((instr & 0xd00) == 0x100) ||
48826                                                ((instr & 0xd00) == 0x500) ||
48827                                                ((instr & 0xd00) == 0x900) ||
48828                                                ((instr & 0xe00) == 0xe00)) {
48829                                              UnallocatedA32(instr);
48830                                              return;
48831                                            }
48832                                            unsigned cmode = (instr >> 8) & 0xf;
48833                                            DataType dt =
48834                                                ImmediateVmvn::DecodeDt(cmode);
48835                                            if (dt.Is(kDataTypeValueInvalid)) {
48836                                              UnallocatedA32(instr);
48837                                              return;
48838                                            }
48839                                            if (((instr >> 12) & 1) != 0) {
48840                                              UnallocatedA32(instr);
48841                                              return;
48842                                            }
48843                                            unsigned rd =
48844                                                ExtractQRegister(instr, 22, 12);
48845                                            QOperand imm =
48846                                                ImmediateVmvn::DecodeImmediate(
48847                                                    cmode,
48848                                                    (instr & 0xf) |
48849                                                        ((instr >> 12) & 0x70) |
48850                                                        ((instr >> 17) & 0x80));
48851                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48852                                            vmvn(al, dt, QRegister(rd), imm);
48853                                            break;
48854                                          }
48855                                          case 0x00000400: {
48856                                            // 0xf2800c50
48857                                            if (((instr & 0x920) == 0x100) ||
48858                                                ((instr & 0x520) == 0x100) ||
48859                                                ((instr & 0x820) == 0x20) ||
48860                                                ((instr & 0x420) == 0x20) ||
48861                                                ((instr & 0x220) == 0x20) ||
48862                                                ((instr & 0x120) == 0x120)) {
48863                                              UnallocatedA32(instr);
48864                                              return;
48865                                            }
48866                                            unsigned cmode =
48867                                                ((instr >> 8) & 0xf) |
48868                                                ((instr >> 1) & 0x10);
48869                                            DataType dt =
48870                                                ImmediateVmov::DecodeDt(cmode);
48871                                            if (dt.Is(kDataTypeValueInvalid)) {
48872                                              UnallocatedA32(instr);
48873                                              return;
48874                                            }
48875                                            if (((instr >> 12) & 1) != 0) {
48876                                              UnallocatedA32(instr);
48877                                              return;
48878                                            }
48879                                            unsigned rd =
48880                                                ExtractQRegister(instr, 22, 12);
48881                                            QOperand imm =
48882                                                ImmediateVmov::DecodeImmediate(
48883                                                    cmode,
48884                                                    (instr & 0xf) |
48885                                                        ((instr >> 12) & 0x70) |
48886                                                        ((instr >> 17) & 0x80));
48887                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48888                                            vmov(al, dt, QRegister(rd), imm);
48889                                            break;
48890                                          }
48891                                          case 0x00000420: {
48892                                            // 0xf2800c70
48893                                            if (((instr & 0xd00) == 0x100) ||
48894                                                ((instr & 0xd00) == 0x500) ||
48895                                                ((instr & 0xd00) == 0x900) ||
48896                                                ((instr & 0xe00) == 0xe00)) {
48897                                              UnallocatedA32(instr);
48898                                              return;
48899                                            }
48900                                            unsigned cmode = (instr >> 8) & 0xf;
48901                                            DataType dt =
48902                                                ImmediateVmvn::DecodeDt(cmode);
48903                                            if (dt.Is(kDataTypeValueInvalid)) {
48904                                              UnallocatedA32(instr);
48905                                              return;
48906                                            }
48907                                            if (((instr >> 12) & 1) != 0) {
48908                                              UnallocatedA32(instr);
48909                                              return;
48910                                            }
48911                                            unsigned rd =
48912                                                ExtractQRegister(instr, 22, 12);
48913                                            QOperand imm =
48914                                                ImmediateVmvn::DecodeImmediate(
48915                                                    cmode,
48916                                                    (instr & 0xf) |
48917                                                        ((instr >> 12) & 0x70) |
48918                                                        ((instr >> 17) & 0x80));
48919                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48920                                            vmvn(al, dt, QRegister(rd), imm);
48921                                            break;
48922                                          }
48923                                          case 0x00000600: {
48924                                            // 0xf2800e50
48925                                            if (((instr & 0x920) == 0x100) ||
48926                                                ((instr & 0x520) == 0x100) ||
48927                                                ((instr & 0x820) == 0x20) ||
48928                                                ((instr & 0x420) == 0x20) ||
48929                                                ((instr & 0x220) == 0x20) ||
48930                                                ((instr & 0x120) == 0x120)) {
48931                                              UnallocatedA32(instr);
48932                                              return;
48933                                            }
48934                                            unsigned cmode =
48935                                                ((instr >> 8) & 0xf) |
48936                                                ((instr >> 1) & 0x10);
48937                                            DataType dt =
48938                                                ImmediateVmov::DecodeDt(cmode);
48939                                            if (dt.Is(kDataTypeValueInvalid)) {
48940                                              UnallocatedA32(instr);
48941                                              return;
48942                                            }
48943                                            if (((instr >> 12) & 1) != 0) {
48944                                              UnallocatedA32(instr);
48945                                              return;
48946                                            }
48947                                            unsigned rd =
48948                                                ExtractQRegister(instr, 22, 12);
48949                                            QOperand imm =
48950                                                ImmediateVmov::DecodeImmediate(
48951                                                    cmode,
48952                                                    (instr & 0xf) |
48953                                                        ((instr >> 12) & 0x70) |
48954                                                        ((instr >> 17) & 0x80));
48955                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48956                                            vmov(al, dt, QRegister(rd), imm);
48957                                            break;
48958                                          }
48959                                          case 0x00000620: {
48960                                            // 0xf2800e70
48961                                            if (((instr & 0xd00) == 0x100) ||
48962                                                ((instr & 0xd00) == 0x500) ||
48963                                                ((instr & 0xd00) == 0x900) ||
48964                                                ((instr & 0xe00) == 0xe00)) {
48965                                              UnallocatedA32(instr);
48966                                              return;
48967                                            }
48968                                            unsigned cmode = (instr >> 8) & 0xf;
48969                                            DataType dt =
48970                                                ImmediateVmvn::DecodeDt(cmode);
48971                                            if (dt.Is(kDataTypeValueInvalid)) {
48972                                              UnallocatedA32(instr);
48973                                              return;
48974                                            }
48975                                            if (((instr >> 12) & 1) != 0) {
48976                                              UnallocatedA32(instr);
48977                                              return;
48978                                            }
48979                                            unsigned rd =
48980                                                ExtractQRegister(instr, 22, 12);
48981                                            QOperand imm =
48982                                                ImmediateVmvn::DecodeImmediate(
48983                                                    cmode,
48984                                                    (instr & 0xf) |
48985                                                        ((instr >> 12) & 0x70) |
48986                                                        ((instr >> 17) & 0x80));
48987                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
48988                                            vmvn(al, dt, QRegister(rd), imm);
48989                                            break;
48990                                          }
48991                                          case 0x00000800: {
48992                                            // 0xf2800c50
48993                                            if (((instr & 0x920) == 0x100) ||
48994                                                ((instr & 0x520) == 0x100) ||
48995                                                ((instr & 0x820) == 0x20) ||
48996                                                ((instr & 0x420) == 0x20) ||
48997                                                ((instr & 0x220) == 0x20) ||
48998                                                ((instr & 0x120) == 0x120)) {
48999                                              UnallocatedA32(instr);
49000                                              return;
49001                                            }
49002                                            unsigned cmode =
49003                                                ((instr >> 8) & 0xf) |
49004                                                ((instr >> 1) & 0x10);
49005                                            DataType dt =
49006                                                ImmediateVmov::DecodeDt(cmode);
49007                                            if (dt.Is(kDataTypeValueInvalid)) {
49008                                              UnallocatedA32(instr);
49009                                              return;
49010                                            }
49011                                            if (((instr >> 12) & 1) != 0) {
49012                                              UnallocatedA32(instr);
49013                                              return;
49014                                            }
49015                                            unsigned rd =
49016                                                ExtractQRegister(instr, 22, 12);
49017                                            QOperand imm =
49018                                                ImmediateVmov::DecodeImmediate(
49019                                                    cmode,
49020                                                    (instr & 0xf) |
49021                                                        ((instr >> 12) & 0x70) |
49022                                                        ((instr >> 17) & 0x80));
49023                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49024                                            vmov(al, dt, QRegister(rd), imm);
49025                                            break;
49026                                          }
49027                                          case 0x00000820: {
49028                                            // 0xf2800c70
49029                                            if (((instr & 0xd00) == 0x100) ||
49030                                                ((instr & 0xd00) == 0x500) ||
49031                                                ((instr & 0xd00) == 0x900) ||
49032                                                ((instr & 0xe00) == 0xe00)) {
49033                                              UnallocatedA32(instr);
49034                                              return;
49035                                            }
49036                                            unsigned cmode = (instr >> 8) & 0xf;
49037                                            DataType dt =
49038                                                ImmediateVmvn::DecodeDt(cmode);
49039                                            if (dt.Is(kDataTypeValueInvalid)) {
49040                                              UnallocatedA32(instr);
49041                                              return;
49042                                            }
49043                                            if (((instr >> 12) & 1) != 0) {
49044                                              UnallocatedA32(instr);
49045                                              return;
49046                                            }
49047                                            unsigned rd =
49048                                                ExtractQRegister(instr, 22, 12);
49049                                            QOperand imm =
49050                                                ImmediateVmvn::DecodeImmediate(
49051                                                    cmode,
49052                                                    (instr & 0xf) |
49053                                                        ((instr >> 12) & 0x70) |
49054                                                        ((instr >> 17) & 0x80));
49055                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49056                                            vmvn(al, dt, QRegister(rd), imm);
49057                                            break;
49058                                          }
49059                                          case 0x00000a00: {
49060                                            // 0xf2800e50
49061                                            if (((instr & 0x920) == 0x100) ||
49062                                                ((instr & 0x520) == 0x100) ||
49063                                                ((instr & 0x820) == 0x20) ||
49064                                                ((instr & 0x420) == 0x20) ||
49065                                                ((instr & 0x220) == 0x20) ||
49066                                                ((instr & 0x120) == 0x120)) {
49067                                              UnallocatedA32(instr);
49068                                              return;
49069                                            }
49070                                            unsigned cmode =
49071                                                ((instr >> 8) & 0xf) |
49072                                                ((instr >> 1) & 0x10);
49073                                            DataType dt =
49074                                                ImmediateVmov::DecodeDt(cmode);
49075                                            if (dt.Is(kDataTypeValueInvalid)) {
49076                                              UnallocatedA32(instr);
49077                                              return;
49078                                            }
49079                                            if (((instr >> 12) & 1) != 0) {
49080                                              UnallocatedA32(instr);
49081                                              return;
49082                                            }
49083                                            unsigned rd =
49084                                                ExtractQRegister(instr, 22, 12);
49085                                            QOperand imm =
49086                                                ImmediateVmov::DecodeImmediate(
49087                                                    cmode,
49088                                                    (instr & 0xf) |
49089                                                        ((instr >> 12) & 0x70) |
49090                                                        ((instr >> 17) & 0x80));
49091                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49092                                            vmov(al, dt, QRegister(rd), imm);
49093                                            break;
49094                                          }
49095                                          case 0x00000a20: {
49096                                            // 0xf2800e70
49097                                            if (((instr & 0xd00) == 0x100) ||
49098                                                ((instr & 0xd00) == 0x500) ||
49099                                                ((instr & 0xd00) == 0x900) ||
49100                                                ((instr & 0xe00) == 0xe00)) {
49101                                              UnallocatedA32(instr);
49102                                              return;
49103                                            }
49104                                            unsigned cmode = (instr >> 8) & 0xf;
49105                                            DataType dt =
49106                                                ImmediateVmvn::DecodeDt(cmode);
49107                                            if (dt.Is(kDataTypeValueInvalid)) {
49108                                              UnallocatedA32(instr);
49109                                              return;
49110                                            }
49111                                            if (((instr >> 12) & 1) != 0) {
49112                                              UnallocatedA32(instr);
49113                                              return;
49114                                            }
49115                                            unsigned rd =
49116                                                ExtractQRegister(instr, 22, 12);
49117                                            QOperand imm =
49118                                                ImmediateVmvn::DecodeImmediate(
49119                                                    cmode,
49120                                                    (instr & 0xf) |
49121                                                        ((instr >> 12) & 0x70) |
49122                                                        ((instr >> 17) & 0x80));
49123                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49124                                            vmvn(al, dt, QRegister(rd), imm);
49125                                            break;
49126                                          }
49127                                          case 0x00000c00: {
49128                                            // 0xf2800c50
49129                                            if (((instr & 0x920) == 0x100) ||
49130                                                ((instr & 0x520) == 0x100) ||
49131                                                ((instr & 0x820) == 0x20) ||
49132                                                ((instr & 0x420) == 0x20) ||
49133                                                ((instr & 0x220) == 0x20) ||
49134                                                ((instr & 0x120) == 0x120)) {
49135                                              UnallocatedA32(instr);
49136                                              return;
49137                                            }
49138                                            unsigned cmode =
49139                                                ((instr >> 8) & 0xf) |
49140                                                ((instr >> 1) & 0x10);
49141                                            DataType dt =
49142                                                ImmediateVmov::DecodeDt(cmode);
49143                                            if (dt.Is(kDataTypeValueInvalid)) {
49144                                              UnallocatedA32(instr);
49145                                              return;
49146                                            }
49147                                            if (((instr >> 12) & 1) != 0) {
49148                                              UnallocatedA32(instr);
49149                                              return;
49150                                            }
49151                                            unsigned rd =
49152                                                ExtractQRegister(instr, 22, 12);
49153                                            QOperand imm =
49154                                                ImmediateVmov::DecodeImmediate(
49155                                                    cmode,
49156                                                    (instr & 0xf) |
49157                                                        ((instr >> 12) & 0x70) |
49158                                                        ((instr >> 17) & 0x80));
49159                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49160                                            vmov(al, dt, QRegister(rd), imm);
49161                                            break;
49162                                          }
49163                                          case 0x00000c20: {
49164                                            // 0xf2800c70
49165                                            if (((instr & 0xd00) == 0x100) ||
49166                                                ((instr & 0xd00) == 0x500) ||
49167                                                ((instr & 0xd00) == 0x900) ||
49168                                                ((instr & 0xe00) == 0xe00)) {
49169                                              UnallocatedA32(instr);
49170                                              return;
49171                                            }
49172                                            unsigned cmode = (instr >> 8) & 0xf;
49173                                            DataType dt =
49174                                                ImmediateVmvn::DecodeDt(cmode);
49175                                            if (dt.Is(kDataTypeValueInvalid)) {
49176                                              UnallocatedA32(instr);
49177                                              return;
49178                                            }
49179                                            if (((instr >> 12) & 1) != 0) {
49180                                              UnallocatedA32(instr);
49181                                              return;
49182                                            }
49183                                            unsigned rd =
49184                                                ExtractQRegister(instr, 22, 12);
49185                                            QOperand imm =
49186                                                ImmediateVmvn::DecodeImmediate(
49187                                                    cmode,
49188                                                    (instr & 0xf) |
49189                                                        ((instr >> 12) & 0x70) |
49190                                                        ((instr >> 17) & 0x80));
49191                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49192                                            vmvn(al, dt, QRegister(rd), imm);
49193                                            break;
49194                                          }
49195                                          case 0x00000d00: {
49196                                            // 0xf2800d50
49197                                            if (((instr & 0x920) == 0x100) ||
49198                                                ((instr & 0x520) == 0x100) ||
49199                                                ((instr & 0x820) == 0x20) ||
49200                                                ((instr & 0x420) == 0x20) ||
49201                                                ((instr & 0x220) == 0x20) ||
49202                                                ((instr & 0x120) == 0x120)) {
49203                                              UnallocatedA32(instr);
49204                                              return;
49205                                            }
49206                                            unsigned cmode =
49207                                                ((instr >> 8) & 0xf) |
49208                                                ((instr >> 1) & 0x10);
49209                                            DataType dt =
49210                                                ImmediateVmov::DecodeDt(cmode);
49211                                            if (dt.Is(kDataTypeValueInvalid)) {
49212                                              UnallocatedA32(instr);
49213                                              return;
49214                                            }
49215                                            if (((instr >> 12) & 1) != 0) {
49216                                              UnallocatedA32(instr);
49217                                              return;
49218                                            }
49219                                            unsigned rd =
49220                                                ExtractQRegister(instr, 22, 12);
49221                                            QOperand imm =
49222                                                ImmediateVmov::DecodeImmediate(
49223                                                    cmode,
49224                                                    (instr & 0xf) |
49225                                                        ((instr >> 12) & 0x70) |
49226                                                        ((instr >> 17) & 0x80));
49227                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49228                                            vmov(al, dt, QRegister(rd), imm);
49229                                            break;
49230                                          }
49231                                          case 0x00000d20: {
49232                                            // 0xf2800d70
49233                                            if (((instr & 0xd00) == 0x100) ||
49234                                                ((instr & 0xd00) == 0x500) ||
49235                                                ((instr & 0xd00) == 0x900) ||
49236                                                ((instr & 0xe00) == 0xe00)) {
49237                                              UnallocatedA32(instr);
49238                                              return;
49239                                            }
49240                                            unsigned cmode = (instr >> 8) & 0xf;
49241                                            DataType dt =
49242                                                ImmediateVmvn::DecodeDt(cmode);
49243                                            if (dt.Is(kDataTypeValueInvalid)) {
49244                                              UnallocatedA32(instr);
49245                                              return;
49246                                            }
49247                                            if (((instr >> 12) & 1) != 0) {
49248                                              UnallocatedA32(instr);
49249                                              return;
49250                                            }
49251                                            unsigned rd =
49252                                                ExtractQRegister(instr, 22, 12);
49253                                            QOperand imm =
49254                                                ImmediateVmvn::DecodeImmediate(
49255                                                    cmode,
49256                                                    (instr & 0xf) |
49257                                                        ((instr >> 12) & 0x70) |
49258                                                        ((instr >> 17) & 0x80));
49259                                            // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49260                                            vmvn(al, dt, QRegister(rd), imm);
49261                                            break;
49262                                          }
49263                                          case 0x00000e00: {
49264                                            // 0xf2800e50
49265                                            if (((instr & 0x920) == 0x100) ||
49266                                                ((instr & 0x520) == 0x100) ||
49267                                                ((instr & 0x820) == 0x20) ||
49268                                                ((instr & 0x420) == 0x20) ||
49269                                                ((instr & 0x220) == 0x20) ||
49270                                                ((instr & 0x120) == 0x120)) {
49271                                              UnallocatedA32(instr);
49272                                              return;
49273                                            }
49274                                            unsigned cmode =
49275                                                ((instr >> 8) & 0xf) |
49276                                                ((instr >> 1) & 0x10);
49277                                            DataType dt =
49278                                                ImmediateVmov::DecodeDt(cmode);
49279                                            if (dt.Is(kDataTypeValueInvalid)) {
49280                                              UnallocatedA32(instr);
49281                                              return;
49282                                            }
49283                                            if (((instr >> 12) & 1) != 0) {
49284                                              UnallocatedA32(instr);
49285                                              return;
49286                                            }
49287                                            unsigned rd =
49288                                                ExtractQRegister(instr, 22, 12);
49289                                            QOperand imm =
49290                                                ImmediateVmov::DecodeImmediate(
49291                                                    cmode,
49292                                                    (instr & 0xf) |
49293                                                        ((instr >> 12) & 0x70) |
49294                                                        ((instr >> 17) & 0x80));
49295                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49296                                            vmov(al, dt, QRegister(rd), imm);
49297                                            break;
49298                                          }
49299                                          case 0x00000e20: {
49300                                            // 0xf2800e70
49301                                            if (((instr & 0x920) == 0x100) ||
49302                                                ((instr & 0x520) == 0x100) ||
49303                                                ((instr & 0x820) == 0x20) ||
49304                                                ((instr & 0x420) == 0x20) ||
49305                                                ((instr & 0x220) == 0x20) ||
49306                                                ((instr & 0x120) == 0x120)) {
49307                                              UnallocatedA32(instr);
49308                                              return;
49309                                            }
49310                                            unsigned cmode =
49311                                                ((instr >> 8) & 0xf) |
49312                                                ((instr >> 1) & 0x10);
49313                                            DataType dt =
49314                                                ImmediateVmov::DecodeDt(cmode);
49315                                            if (dt.Is(kDataTypeValueInvalid)) {
49316                                              UnallocatedA32(instr);
49317                                              return;
49318                                            }
49319                                            if (((instr >> 12) & 1) != 0) {
49320                                              UnallocatedA32(instr);
49321                                              return;
49322                                            }
49323                                            unsigned rd =
49324                                                ExtractQRegister(instr, 22, 12);
49325                                            QOperand imm =
49326                                                ImmediateVmov::DecodeImmediate(
49327                                                    cmode,
49328                                                    (instr & 0xf) |
49329                                                        ((instr >> 12) & 0x70) |
49330                                                        ((instr >> 17) & 0x80));
49331                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49332                                            vmov(al, dt, QRegister(rd), imm);
49333                                            break;
49334                                          }
49335                                          case 0x00000f00: {
49336                                            // 0xf2800f50
49337                                            if (((instr & 0x920) == 0x100) ||
49338                                                ((instr & 0x520) == 0x100) ||
49339                                                ((instr & 0x820) == 0x20) ||
49340                                                ((instr & 0x420) == 0x20) ||
49341                                                ((instr & 0x220) == 0x20) ||
49342                                                ((instr & 0x120) == 0x120)) {
49343                                              UnallocatedA32(instr);
49344                                              return;
49345                                            }
49346                                            unsigned cmode =
49347                                                ((instr >> 8) & 0xf) |
49348                                                ((instr >> 1) & 0x10);
49349                                            DataType dt =
49350                                                ImmediateVmov::DecodeDt(cmode);
49351                                            if (dt.Is(kDataTypeValueInvalid)) {
49352                                              UnallocatedA32(instr);
49353                                              return;
49354                                            }
49355                                            if (((instr >> 12) & 1) != 0) {
49356                                              UnallocatedA32(instr);
49357                                              return;
49358                                            }
49359                                            unsigned rd =
49360                                                ExtractQRegister(instr, 22, 12);
49361                                            QOperand imm =
49362                                                ImmediateVmov::DecodeImmediate(
49363                                                    cmode,
49364                                                    (instr & 0xf) |
49365                                                        ((instr >> 12) & 0x70) |
49366                                                        ((instr >> 17) & 0x80));
49367                                            // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49368                                            vmov(al, dt, QRegister(rd), imm);
49369                                            break;
49370                                          }
49371                                          default:
49372                                            UnallocatedA32(instr);
49373                                            break;
49374                                        }
49375                                        break;
49376                                      }
49377                                      default: {
49378                                        if (((instr & 0x920) == 0x100) ||
49379                                            ((instr & 0x520) == 0x100) ||
49380                                            ((instr & 0x820) == 0x20) ||
49381                                            ((instr & 0x420) == 0x20) ||
49382                                            ((instr & 0x220) == 0x20) ||
49383                                            ((instr & 0x120) == 0x120)) {
49384                                          UnallocatedA32(instr);
49385                                          return;
49386                                        }
49387                                        unsigned cmode = ((instr >> 8) & 0xf) |
49388                                                         ((instr >> 1) & 0x10);
49389                                        DataType dt =
49390                                            ImmediateVmov::DecodeDt(cmode);
49391                                        if (dt.Is(kDataTypeValueInvalid)) {
49392                                          UnallocatedA32(instr);
49393                                          return;
49394                                        }
49395                                        if (((instr >> 12) & 1) != 0) {
49396                                          UnallocatedA32(instr);
49397                                          return;
49398                                        }
49399                                        unsigned rd =
49400                                            ExtractQRegister(instr, 22, 12);
49401                                        QOperand imm =
49402                                            ImmediateVmov::DecodeImmediate(
49403                                                cmode,
49404                                                (instr & 0xf) |
49405                                                    ((instr >> 12) & 0x70) |
49406                                                    ((instr >> 17) & 0x80));
49407                                        // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
49408                                        vmov(al, dt, QRegister(rd), imm);
49409                                        break;
49410                                      }
49411                                    }
49412                                    break;
49413                                  }
49414                                }
49415                                break;
49416                              }
49417                              default:
49418                                UnallocatedA32(instr);
49419                                break;
49420                            }
49421                            break;
49422                          }
49423                          default: {
49424                            if ((instr & 0x00000200) == 0x00000200) {
49425                              if (((instr & 0x200000) == 0x0)) {
49426                                UnallocatedA32(instr);
49427                                return;
49428                              }
49429                              DataType dt1 = Dt_op_U_1_Decode1(
49430                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
49431                              if (dt1.Is(kDataTypeValueInvalid)) {
49432                                UnallocatedA32(instr);
49433                                return;
49434                              }
49435                              DataType dt2 = Dt_op_U_1_Decode2(
49436                                  ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
49437                              if (dt2.Is(kDataTypeValueInvalid)) {
49438                                UnallocatedA32(instr);
49439                                return;
49440                              }
49441                              if (((instr >> 12) & 1) != 0) {
49442                                UnallocatedA32(instr);
49443                                return;
49444                              }
49445                              unsigned rd = ExtractQRegister(instr, 22, 12);
49446                              if ((instr & 1) != 0) {
49447                                UnallocatedA32(instr);
49448                                return;
49449                              }
49450                              unsigned rm = ExtractQRegister(instr, 5, 0);
49451                              uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
49452                              // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
49453                              vcvt(al,
49454                                   dt1,
49455                                   dt2,
49456                                   QRegister(rd),
49457                                   QRegister(rm),
49458                                   fbits);
49459                            } else {
49460                              UnallocatedA32(instr);
49461                            }
49462                            break;
49463                          }
49464                        }
49465                        break;
49466                      }
49467                      default:
49468                        UnallocatedA32(instr);
49469                        break;
49470                    }
49471                    break;
49472                  }
49473                }
49474                break;
49475              }
49476            }
49477            break;
49478          }
49479        }
49480        break;
49481      }
49482      case 0x04000000: {
49483        // 0xf4000000
49484        switch (instr & 0x01300000) {
49485          case 0x00000000: {
49486            // 0xf4000000
49487            switch (instr & 0x00800000) {
49488              case 0x00000000: {
49489                // 0xf4000000
49490                switch (instr & 0x0000000d) {
49491                  case 0x0000000d: {
49492                    // 0xf400000d
49493                    switch (instr & 0x00000002) {
49494                      case 0x00000000: {
49495                        // 0xf400000d
49496                        switch (instr & 0x00000f00) {
49497                          case 0x00000000: {
49498                            // 0xf400000d
49499                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49500                            if (dt.Is(kDataTypeValueInvalid)) {
49501                              UnallocatedA32(instr);
49502                              return;
49503                            }
49504                            Alignment align =
49505                                Align_align_4_Decode((instr >> 4) & 0x3);
49506                            if (dt.Is(kDataTypeValueInvalid) ||
49507                                align.Is(kBadAlignment)) {
49508                              UnallocatedA32(instr);
49509                              return;
49510                            }
49511                            unsigned first = ExtractDRegister(instr, 22, 12);
49512                            unsigned length;
49513                            SpacingType spacing;
49514                            switch ((instr >> 8) & 0xf) {
49515                              default:
49516                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49517                              case 0x0:
49518                                length = 4;
49519                                spacing = kSingle;
49520                                break;
49521                              case 0x1:
49522                                length = 4;
49523                                spacing = kDouble;
49524                                break;
49525                            }
49526                            unsigned last =
49527                                first +
49528                                (length - 1) * (spacing == kSingle ? 1 : 2);
49529                            TransferType transfer = kMultipleLanes;
49530                            unsigned rn = (instr >> 16) & 0xf;
49531                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49532                            vst4(al,
49533                                 dt,
49534                                 NeonRegisterList(DRegister(first),
49535                                                  DRegister(last),
49536                                                  spacing,
49537                                                  transfer),
49538                                 AlignedMemOperand(Register(rn),
49539                                                   align,
49540                                                   PostIndex));
49541                            break;
49542                          }
49543                          case 0x00000100: {
49544                            // 0xf400010d
49545                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49546                            if (dt.Is(kDataTypeValueInvalid)) {
49547                              UnallocatedA32(instr);
49548                              return;
49549                            }
49550                            Alignment align =
49551                                Align_align_4_Decode((instr >> 4) & 0x3);
49552                            if (dt.Is(kDataTypeValueInvalid) ||
49553                                align.Is(kBadAlignment)) {
49554                              UnallocatedA32(instr);
49555                              return;
49556                            }
49557                            unsigned first = ExtractDRegister(instr, 22, 12);
49558                            unsigned length;
49559                            SpacingType spacing;
49560                            switch ((instr >> 8) & 0xf) {
49561                              default:
49562                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49563                              case 0x0:
49564                                length = 4;
49565                                spacing = kSingle;
49566                                break;
49567                              case 0x1:
49568                                length = 4;
49569                                spacing = kDouble;
49570                                break;
49571                            }
49572                            unsigned last =
49573                                first +
49574                                (length - 1) * (spacing == kSingle ? 1 : 2);
49575                            TransferType transfer = kMultipleLanes;
49576                            unsigned rn = (instr >> 16) & 0xf;
49577                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49578                            vst4(al,
49579                                 dt,
49580                                 NeonRegisterList(DRegister(first),
49581                                                  DRegister(last),
49582                                                  spacing,
49583                                                  transfer),
49584                                 AlignedMemOperand(Register(rn),
49585                                                   align,
49586                                                   PostIndex));
49587                            break;
49588                          }
49589                          case 0x00000200: {
49590                            // 0xf400020d
49591                            if (((instr & 0xe20) == 0x620) ||
49592                                ((instr & 0xf30) == 0xa30)) {
49593                              UnallocatedA32(instr);
49594                              return;
49595                            }
49596                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
49597                            if (dt.Is(kDataTypeValueInvalid)) {
49598                              UnallocatedA32(instr);
49599                              return;
49600                            }
49601                            Alignment align =
49602                                Align_align_5_Decode((instr >> 4) & 0x3);
49603                            if (dt.Is(kDataTypeValueInvalid) ||
49604                                align.Is(kBadAlignment)) {
49605                              UnallocatedA32(instr);
49606                              return;
49607                            }
49608                            unsigned first = ExtractDRegister(instr, 22, 12);
49609                            unsigned length;
49610                            SpacingType spacing = kSingle;
49611                            switch ((instr >> 8) & 0xf) {
49612                              default:
49613                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49614                              case 0x7:
49615                                length = 1;
49616                                break;
49617                              case 0xa:
49618                                length = 2;
49619                                break;
49620                              case 0x6:
49621                                length = 3;
49622                                break;
49623                              case 0x2:
49624                                length = 4;
49625                                break;
49626                            }
49627                            unsigned last = first + length - 1;
49628                            TransferType transfer = kMultipleLanes;
49629                            unsigned rn = (instr >> 16) & 0xf;
49630                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49631                            vst1(al,
49632                                 dt,
49633                                 NeonRegisterList(DRegister(first),
49634                                                  DRegister(last),
49635                                                  spacing,
49636                                                  transfer),
49637                                 AlignedMemOperand(Register(rn),
49638                                                   align,
49639                                                   PostIndex));
49640                            break;
49641                          }
49642                          case 0x00000300: {
49643                            // 0xf400030d
49644                            if (((instr & 0xe30) == 0x830)) {
49645                              UnallocatedA32(instr);
49646                              return;
49647                            }
49648                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49649                            if (dt.Is(kDataTypeValueInvalid)) {
49650                              UnallocatedA32(instr);
49651                              return;
49652                            }
49653                            Alignment align =
49654                                Align_align_2_Decode((instr >> 4) & 0x3);
49655                            if (dt.Is(kDataTypeValueInvalid) ||
49656                                align.Is(kBadAlignment)) {
49657                              UnallocatedA32(instr);
49658                              return;
49659                            }
49660                            unsigned first = ExtractDRegister(instr, 22, 12);
49661                            unsigned length;
49662                            SpacingType spacing;
49663                            switch ((instr >> 8) & 0xf) {
49664                              default:
49665                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49666                              case 0x8:
49667                                length = 2;
49668                                spacing = kSingle;
49669                                break;
49670                              case 0x9:
49671                                length = 2;
49672                                spacing = kDouble;
49673                                break;
49674                              case 0x3:
49675                                length = 4;
49676                                spacing = kSingle;
49677                                break;
49678                            }
49679                            unsigned last =
49680                                first +
49681                                (length - 1) * (spacing == kSingle ? 1 : 2);
49682                            TransferType transfer = kMultipleLanes;
49683                            unsigned rn = (instr >> 16) & 0xf;
49684                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49685                            vst2(al,
49686                                 dt,
49687                                 NeonRegisterList(DRegister(first),
49688                                                  DRegister(last),
49689                                                  spacing,
49690                                                  transfer),
49691                                 AlignedMemOperand(Register(rn),
49692                                                   align,
49693                                                   PostIndex));
49694                            break;
49695                          }
49696                          case 0x00000400: {
49697                            // 0xf400040d
49698                            if (((instr & 0x20) == 0x20)) {
49699                              UnallocatedA32(instr);
49700                              return;
49701                            }
49702                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49703                            if (dt.Is(kDataTypeValueInvalid)) {
49704                              UnallocatedA32(instr);
49705                              return;
49706                            }
49707                            Alignment align =
49708                                Align_align_3_Decode((instr >> 4) & 0x3);
49709                            if (dt.Is(kDataTypeValueInvalid) ||
49710                                align.Is(kBadAlignment)) {
49711                              UnallocatedA32(instr);
49712                              return;
49713                            }
49714                            unsigned first = ExtractDRegister(instr, 22, 12);
49715                            unsigned length;
49716                            SpacingType spacing;
49717                            switch ((instr >> 8) & 0xf) {
49718                              default:
49719                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49720                              case 0x4:
49721                                length = 3;
49722                                spacing = kSingle;
49723                                break;
49724                              case 0x5:
49725                                length = 3;
49726                                spacing = kDouble;
49727                                break;
49728                            }
49729                            unsigned last =
49730                                first +
49731                                (length - 1) * (spacing == kSingle ? 1 : 2);
49732                            TransferType transfer = kMultipleLanes;
49733                            unsigned rn = (instr >> 16) & 0xf;
49734                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49735                            vst3(al,
49736                                 dt,
49737                                 NeonRegisterList(DRegister(first),
49738                                                  DRegister(last),
49739                                                  spacing,
49740                                                  transfer),
49741                                 AlignedMemOperand(Register(rn),
49742                                                   align,
49743                                                   PostIndex));
49744                            break;
49745                          }
49746                          case 0x00000500: {
49747                            // 0xf400050d
49748                            if (((instr & 0x20) == 0x20)) {
49749                              UnallocatedA32(instr);
49750                              return;
49751                            }
49752                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49753                            if (dt.Is(kDataTypeValueInvalid)) {
49754                              UnallocatedA32(instr);
49755                              return;
49756                            }
49757                            Alignment align =
49758                                Align_align_3_Decode((instr >> 4) & 0x3);
49759                            if (dt.Is(kDataTypeValueInvalid) ||
49760                                align.Is(kBadAlignment)) {
49761                              UnallocatedA32(instr);
49762                              return;
49763                            }
49764                            unsigned first = ExtractDRegister(instr, 22, 12);
49765                            unsigned length;
49766                            SpacingType spacing;
49767                            switch ((instr >> 8) & 0xf) {
49768                              default:
49769                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49770                              case 0x4:
49771                                length = 3;
49772                                spacing = kSingle;
49773                                break;
49774                              case 0x5:
49775                                length = 3;
49776                                spacing = kDouble;
49777                                break;
49778                            }
49779                            unsigned last =
49780                                first +
49781                                (length - 1) * (spacing == kSingle ? 1 : 2);
49782                            TransferType transfer = kMultipleLanes;
49783                            unsigned rn = (instr >> 16) & 0xf;
49784                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49785                            vst3(al,
49786                                 dt,
49787                                 NeonRegisterList(DRegister(first),
49788                                                  DRegister(last),
49789                                                  spacing,
49790                                                  transfer),
49791                                 AlignedMemOperand(Register(rn),
49792                                                   align,
49793                                                   PostIndex));
49794                            break;
49795                          }
49796                          case 0x00000600: {
49797                            // 0xf400060d
49798                            if (((instr & 0xe20) == 0x620) ||
49799                                ((instr & 0xf30) == 0xa30)) {
49800                              UnallocatedA32(instr);
49801                              return;
49802                            }
49803                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
49804                            if (dt.Is(kDataTypeValueInvalid)) {
49805                              UnallocatedA32(instr);
49806                              return;
49807                            }
49808                            Alignment align =
49809                                Align_align_5_Decode((instr >> 4) & 0x3);
49810                            if (dt.Is(kDataTypeValueInvalid) ||
49811                                align.Is(kBadAlignment)) {
49812                              UnallocatedA32(instr);
49813                              return;
49814                            }
49815                            unsigned first = ExtractDRegister(instr, 22, 12);
49816                            unsigned length;
49817                            SpacingType spacing = kSingle;
49818                            switch ((instr >> 8) & 0xf) {
49819                              default:
49820                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49821                              case 0x7:
49822                                length = 1;
49823                                break;
49824                              case 0xa:
49825                                length = 2;
49826                                break;
49827                              case 0x6:
49828                                length = 3;
49829                                break;
49830                              case 0x2:
49831                                length = 4;
49832                                break;
49833                            }
49834                            unsigned last = first + length - 1;
49835                            TransferType transfer = kMultipleLanes;
49836                            unsigned rn = (instr >> 16) & 0xf;
49837                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49838                            vst1(al,
49839                                 dt,
49840                                 NeonRegisterList(DRegister(first),
49841                                                  DRegister(last),
49842                                                  spacing,
49843                                                  transfer),
49844                                 AlignedMemOperand(Register(rn),
49845                                                   align,
49846                                                   PostIndex));
49847                            break;
49848                          }
49849                          case 0x00000700: {
49850                            // 0xf400070d
49851                            if (((instr & 0xe20) == 0x620) ||
49852                                ((instr & 0xf30) == 0xa30)) {
49853                              UnallocatedA32(instr);
49854                              return;
49855                            }
49856                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
49857                            if (dt.Is(kDataTypeValueInvalid)) {
49858                              UnallocatedA32(instr);
49859                              return;
49860                            }
49861                            Alignment align =
49862                                Align_align_5_Decode((instr >> 4) & 0x3);
49863                            if (dt.Is(kDataTypeValueInvalid) ||
49864                                align.Is(kBadAlignment)) {
49865                              UnallocatedA32(instr);
49866                              return;
49867                            }
49868                            unsigned first = ExtractDRegister(instr, 22, 12);
49869                            unsigned length;
49870                            SpacingType spacing = kSingle;
49871                            switch ((instr >> 8) & 0xf) {
49872                              default:
49873                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49874                              case 0x7:
49875                                length = 1;
49876                                break;
49877                              case 0xa:
49878                                length = 2;
49879                                break;
49880                              case 0x6:
49881                                length = 3;
49882                                break;
49883                              case 0x2:
49884                                length = 4;
49885                                break;
49886                            }
49887                            unsigned last = first + length - 1;
49888                            TransferType transfer = kMultipleLanes;
49889                            unsigned rn = (instr >> 16) & 0xf;
49890                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49891                            vst1(al,
49892                                 dt,
49893                                 NeonRegisterList(DRegister(first),
49894                                                  DRegister(last),
49895                                                  spacing,
49896                                                  transfer),
49897                                 AlignedMemOperand(Register(rn),
49898                                                   align,
49899                                                   PostIndex));
49900                            break;
49901                          }
49902                          case 0x00000800: {
49903                            // 0xf400080d
49904                            if (((instr & 0xe30) == 0x830)) {
49905                              UnallocatedA32(instr);
49906                              return;
49907                            }
49908                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49909                            if (dt.Is(kDataTypeValueInvalid)) {
49910                              UnallocatedA32(instr);
49911                              return;
49912                            }
49913                            Alignment align =
49914                                Align_align_2_Decode((instr >> 4) & 0x3);
49915                            if (dt.Is(kDataTypeValueInvalid) ||
49916                                align.Is(kBadAlignment)) {
49917                              UnallocatedA32(instr);
49918                              return;
49919                            }
49920                            unsigned first = ExtractDRegister(instr, 22, 12);
49921                            unsigned length;
49922                            SpacingType spacing;
49923                            switch ((instr >> 8) & 0xf) {
49924                              default:
49925                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49926                              case 0x8:
49927                                length = 2;
49928                                spacing = kSingle;
49929                                break;
49930                              case 0x9:
49931                                length = 2;
49932                                spacing = kDouble;
49933                                break;
49934                              case 0x3:
49935                                length = 4;
49936                                spacing = kSingle;
49937                                break;
49938                            }
49939                            unsigned last =
49940                                first +
49941                                (length - 1) * (spacing == kSingle ? 1 : 2);
49942                            TransferType transfer = kMultipleLanes;
49943                            unsigned rn = (instr >> 16) & 0xf;
49944                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49945                            vst2(al,
49946                                 dt,
49947                                 NeonRegisterList(DRegister(first),
49948                                                  DRegister(last),
49949                                                  spacing,
49950                                                  transfer),
49951                                 AlignedMemOperand(Register(rn),
49952                                                   align,
49953                                                   PostIndex));
49954                            break;
49955                          }
49956                          case 0x00000900: {
49957                            // 0xf400090d
49958                            if (((instr & 0xe30) == 0x830)) {
49959                              UnallocatedA32(instr);
49960                              return;
49961                            }
49962                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49963                            if (dt.Is(kDataTypeValueInvalid)) {
49964                              UnallocatedA32(instr);
49965                              return;
49966                            }
49967                            Alignment align =
49968                                Align_align_2_Decode((instr >> 4) & 0x3);
49969                            if (dt.Is(kDataTypeValueInvalid) ||
49970                                align.Is(kBadAlignment)) {
49971                              UnallocatedA32(instr);
49972                              return;
49973                            }
49974                            unsigned first = ExtractDRegister(instr, 22, 12);
49975                            unsigned length;
49976                            SpacingType spacing;
49977                            switch ((instr >> 8) & 0xf) {
49978                              default:
49979                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
49980                              case 0x8:
49981                                length = 2;
49982                                spacing = kSingle;
49983                                break;
49984                              case 0x9:
49985                                length = 2;
49986                                spacing = kDouble;
49987                                break;
49988                              case 0x3:
49989                                length = 4;
49990                                spacing = kSingle;
49991                                break;
49992                            }
49993                            unsigned last =
49994                                first +
49995                                (length - 1) * (spacing == kSingle ? 1 : 2);
49996                            TransferType transfer = kMultipleLanes;
49997                            unsigned rn = (instr >> 16) & 0xf;
49998                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49999                            vst2(al,
50000                                 dt,
50001                                 NeonRegisterList(DRegister(first),
50002                                                  DRegister(last),
50003                                                  spacing,
50004                                                  transfer),
50005                                 AlignedMemOperand(Register(rn),
50006                                                   align,
50007                                                   PostIndex));
50008                            break;
50009                          }
50010                          case 0x00000a00: {
50011                            // 0xf4000a0d
50012                            if (((instr & 0xe20) == 0x620) ||
50013                                ((instr & 0xf30) == 0xa30)) {
50014                              UnallocatedA32(instr);
50015                              return;
50016                            }
50017                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50018                            if (dt.Is(kDataTypeValueInvalid)) {
50019                              UnallocatedA32(instr);
50020                              return;
50021                            }
50022                            Alignment align =
50023                                Align_align_5_Decode((instr >> 4) & 0x3);
50024                            if (dt.Is(kDataTypeValueInvalid) ||
50025                                align.Is(kBadAlignment)) {
50026                              UnallocatedA32(instr);
50027                              return;
50028                            }
50029                            unsigned first = ExtractDRegister(instr, 22, 12);
50030                            unsigned length;
50031                            SpacingType spacing = kSingle;
50032                            switch ((instr >> 8) & 0xf) {
50033                              default:
50034                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50035                              case 0x7:
50036                                length = 1;
50037                                break;
50038                              case 0xa:
50039                                length = 2;
50040                                break;
50041                              case 0x6:
50042                                length = 3;
50043                                break;
50044                              case 0x2:
50045                                length = 4;
50046                                break;
50047                            }
50048                            unsigned last = first + length - 1;
50049                            TransferType transfer = kMultipleLanes;
50050                            unsigned rn = (instr >> 16) & 0xf;
50051                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50052                            vst1(al,
50053                                 dt,
50054                                 NeonRegisterList(DRegister(first),
50055                                                  DRegister(last),
50056                                                  spacing,
50057                                                  transfer),
50058                                 AlignedMemOperand(Register(rn),
50059                                                   align,
50060                                                   PostIndex));
50061                            break;
50062                          }
50063                          default:
50064                            UnallocatedA32(instr);
50065                            break;
50066                        }
50067                        break;
50068                      }
50069                      case 0x00000002: {
50070                        // 0xf400000f
50071                        switch (instr & 0x00000f00) {
50072                          case 0x00000000: {
50073                            // 0xf400000d
50074                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50075                            if (dt.Is(kDataTypeValueInvalid)) {
50076                              UnallocatedA32(instr);
50077                              return;
50078                            }
50079                            Alignment align =
50080                                Align_align_4_Decode((instr >> 4) & 0x3);
50081                            if (dt.Is(kDataTypeValueInvalid) ||
50082                                align.Is(kBadAlignment)) {
50083                              UnallocatedA32(instr);
50084                              return;
50085                            }
50086                            unsigned first = ExtractDRegister(instr, 22, 12);
50087                            unsigned length;
50088                            SpacingType spacing;
50089                            switch ((instr >> 8) & 0xf) {
50090                              default:
50091                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50092                              case 0x0:
50093                                length = 4;
50094                                spacing = kSingle;
50095                                break;
50096                              case 0x1:
50097                                length = 4;
50098                                spacing = kDouble;
50099                                break;
50100                            }
50101                            unsigned last =
50102                                first +
50103                                (length - 1) * (spacing == kSingle ? 1 : 2);
50104                            TransferType transfer = kMultipleLanes;
50105                            unsigned rn = (instr >> 16) & 0xf;
50106                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50107                            vst4(al,
50108                                 dt,
50109                                 NeonRegisterList(DRegister(first),
50110                                                  DRegister(last),
50111                                                  spacing,
50112                                                  transfer),
50113                                 AlignedMemOperand(Register(rn),
50114                                                   align,
50115                                                   Offset));
50116                            break;
50117                          }
50118                          case 0x00000100: {
50119                            // 0xf400010d
50120                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50121                            if (dt.Is(kDataTypeValueInvalid)) {
50122                              UnallocatedA32(instr);
50123                              return;
50124                            }
50125                            Alignment align =
50126                                Align_align_4_Decode((instr >> 4) & 0x3);
50127                            if (dt.Is(kDataTypeValueInvalid) ||
50128                                align.Is(kBadAlignment)) {
50129                              UnallocatedA32(instr);
50130                              return;
50131                            }
50132                            unsigned first = ExtractDRegister(instr, 22, 12);
50133                            unsigned length;
50134                            SpacingType spacing;
50135                            switch ((instr >> 8) & 0xf) {
50136                              default:
50137                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50138                              case 0x0:
50139                                length = 4;
50140                                spacing = kSingle;
50141                                break;
50142                              case 0x1:
50143                                length = 4;
50144                                spacing = kDouble;
50145                                break;
50146                            }
50147                            unsigned last =
50148                                first +
50149                                (length - 1) * (spacing == kSingle ? 1 : 2);
50150                            TransferType transfer = kMultipleLanes;
50151                            unsigned rn = (instr >> 16) & 0xf;
50152                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50153                            vst4(al,
50154                                 dt,
50155                                 NeonRegisterList(DRegister(first),
50156                                                  DRegister(last),
50157                                                  spacing,
50158                                                  transfer),
50159                                 AlignedMemOperand(Register(rn),
50160                                                   align,
50161                                                   Offset));
50162                            break;
50163                          }
50164                          case 0x00000200: {
50165                            // 0xf400020d
50166                            if (((instr & 0xe20) == 0x620) ||
50167                                ((instr & 0xf30) == 0xa30)) {
50168                              UnallocatedA32(instr);
50169                              return;
50170                            }
50171                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50172                            if (dt.Is(kDataTypeValueInvalid)) {
50173                              UnallocatedA32(instr);
50174                              return;
50175                            }
50176                            Alignment align =
50177                                Align_align_5_Decode((instr >> 4) & 0x3);
50178                            if (dt.Is(kDataTypeValueInvalid) ||
50179                                align.Is(kBadAlignment)) {
50180                              UnallocatedA32(instr);
50181                              return;
50182                            }
50183                            unsigned first = ExtractDRegister(instr, 22, 12);
50184                            unsigned length;
50185                            SpacingType spacing = kSingle;
50186                            switch ((instr >> 8) & 0xf) {
50187                              default:
50188                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50189                              case 0x7:
50190                                length = 1;
50191                                break;
50192                              case 0xa:
50193                                length = 2;
50194                                break;
50195                              case 0x6:
50196                                length = 3;
50197                                break;
50198                              case 0x2:
50199                                length = 4;
50200                                break;
50201                            }
50202                            unsigned last = first + length - 1;
50203                            TransferType transfer = kMultipleLanes;
50204                            unsigned rn = (instr >> 16) & 0xf;
50205                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50206                            vst1(al,
50207                                 dt,
50208                                 NeonRegisterList(DRegister(first),
50209                                                  DRegister(last),
50210                                                  spacing,
50211                                                  transfer),
50212                                 AlignedMemOperand(Register(rn),
50213                                                   align,
50214                                                   Offset));
50215                            break;
50216                          }
50217                          case 0x00000300: {
50218                            // 0xf400030d
50219                            if (((instr & 0xe30) == 0x830)) {
50220                              UnallocatedA32(instr);
50221                              return;
50222                            }
50223                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50224                            if (dt.Is(kDataTypeValueInvalid)) {
50225                              UnallocatedA32(instr);
50226                              return;
50227                            }
50228                            Alignment align =
50229                                Align_align_2_Decode((instr >> 4) & 0x3);
50230                            if (dt.Is(kDataTypeValueInvalid) ||
50231                                align.Is(kBadAlignment)) {
50232                              UnallocatedA32(instr);
50233                              return;
50234                            }
50235                            unsigned first = ExtractDRegister(instr, 22, 12);
50236                            unsigned length;
50237                            SpacingType spacing;
50238                            switch ((instr >> 8) & 0xf) {
50239                              default:
50240                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50241                              case 0x8:
50242                                length = 2;
50243                                spacing = kSingle;
50244                                break;
50245                              case 0x9:
50246                                length = 2;
50247                                spacing = kDouble;
50248                                break;
50249                              case 0x3:
50250                                length = 4;
50251                                spacing = kSingle;
50252                                break;
50253                            }
50254                            unsigned last =
50255                                first +
50256                                (length - 1) * (spacing == kSingle ? 1 : 2);
50257                            TransferType transfer = kMultipleLanes;
50258                            unsigned rn = (instr >> 16) & 0xf;
50259                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50260                            vst2(al,
50261                                 dt,
50262                                 NeonRegisterList(DRegister(first),
50263                                                  DRegister(last),
50264                                                  spacing,
50265                                                  transfer),
50266                                 AlignedMemOperand(Register(rn),
50267                                                   align,
50268                                                   Offset));
50269                            break;
50270                          }
50271                          case 0x00000400: {
50272                            // 0xf400040d
50273                            if (((instr & 0x20) == 0x20)) {
50274                              UnallocatedA32(instr);
50275                              return;
50276                            }
50277                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50278                            if (dt.Is(kDataTypeValueInvalid)) {
50279                              UnallocatedA32(instr);
50280                              return;
50281                            }
50282                            Alignment align =
50283                                Align_align_3_Decode((instr >> 4) & 0x3);
50284                            if (dt.Is(kDataTypeValueInvalid) ||
50285                                align.Is(kBadAlignment)) {
50286                              UnallocatedA32(instr);
50287                              return;
50288                            }
50289                            unsigned first = ExtractDRegister(instr, 22, 12);
50290                            unsigned length;
50291                            SpacingType spacing;
50292                            switch ((instr >> 8) & 0xf) {
50293                              default:
50294                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50295                              case 0x4:
50296                                length = 3;
50297                                spacing = kSingle;
50298                                break;
50299                              case 0x5:
50300                                length = 3;
50301                                spacing = kDouble;
50302                                break;
50303                            }
50304                            unsigned last =
50305                                first +
50306                                (length - 1) * (spacing == kSingle ? 1 : 2);
50307                            TransferType transfer = kMultipleLanes;
50308                            unsigned rn = (instr >> 16) & 0xf;
50309                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50310                            vst3(al,
50311                                 dt,
50312                                 NeonRegisterList(DRegister(first),
50313                                                  DRegister(last),
50314                                                  spacing,
50315                                                  transfer),
50316                                 AlignedMemOperand(Register(rn),
50317                                                   align,
50318                                                   Offset));
50319                            break;
50320                          }
50321                          case 0x00000500: {
50322                            // 0xf400050d
50323                            if (((instr & 0x20) == 0x20)) {
50324                              UnallocatedA32(instr);
50325                              return;
50326                            }
50327                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50328                            if (dt.Is(kDataTypeValueInvalid)) {
50329                              UnallocatedA32(instr);
50330                              return;
50331                            }
50332                            Alignment align =
50333                                Align_align_3_Decode((instr >> 4) & 0x3);
50334                            if (dt.Is(kDataTypeValueInvalid) ||
50335                                align.Is(kBadAlignment)) {
50336                              UnallocatedA32(instr);
50337                              return;
50338                            }
50339                            unsigned first = ExtractDRegister(instr, 22, 12);
50340                            unsigned length;
50341                            SpacingType spacing;
50342                            switch ((instr >> 8) & 0xf) {
50343                              default:
50344                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50345                              case 0x4:
50346                                length = 3;
50347                                spacing = kSingle;
50348                                break;
50349                              case 0x5:
50350                                length = 3;
50351                                spacing = kDouble;
50352                                break;
50353                            }
50354                            unsigned last =
50355                                first +
50356                                (length - 1) * (spacing == kSingle ? 1 : 2);
50357                            TransferType transfer = kMultipleLanes;
50358                            unsigned rn = (instr >> 16) & 0xf;
50359                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50360                            vst3(al,
50361                                 dt,
50362                                 NeonRegisterList(DRegister(first),
50363                                                  DRegister(last),
50364                                                  spacing,
50365                                                  transfer),
50366                                 AlignedMemOperand(Register(rn),
50367                                                   align,
50368                                                   Offset));
50369                            break;
50370                          }
50371                          case 0x00000600: {
50372                            // 0xf400060d
50373                            if (((instr & 0xe20) == 0x620) ||
50374                                ((instr & 0xf30) == 0xa30)) {
50375                              UnallocatedA32(instr);
50376                              return;
50377                            }
50378                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50379                            if (dt.Is(kDataTypeValueInvalid)) {
50380                              UnallocatedA32(instr);
50381                              return;
50382                            }
50383                            Alignment align =
50384                                Align_align_5_Decode((instr >> 4) & 0x3);
50385                            if (dt.Is(kDataTypeValueInvalid) ||
50386                                align.Is(kBadAlignment)) {
50387                              UnallocatedA32(instr);
50388                              return;
50389                            }
50390                            unsigned first = ExtractDRegister(instr, 22, 12);
50391                            unsigned length;
50392                            SpacingType spacing = kSingle;
50393                            switch ((instr >> 8) & 0xf) {
50394                              default:
50395                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50396                              case 0x7:
50397                                length = 1;
50398                                break;
50399                              case 0xa:
50400                                length = 2;
50401                                break;
50402                              case 0x6:
50403                                length = 3;
50404                                break;
50405                              case 0x2:
50406                                length = 4;
50407                                break;
50408                            }
50409                            unsigned last = first + length - 1;
50410                            TransferType transfer = kMultipleLanes;
50411                            unsigned rn = (instr >> 16) & 0xf;
50412                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50413                            vst1(al,
50414                                 dt,
50415                                 NeonRegisterList(DRegister(first),
50416                                                  DRegister(last),
50417                                                  spacing,
50418                                                  transfer),
50419                                 AlignedMemOperand(Register(rn),
50420                                                   align,
50421                                                   Offset));
50422                            break;
50423                          }
50424                          case 0x00000700: {
50425                            // 0xf400070d
50426                            if (((instr & 0xe20) == 0x620) ||
50427                                ((instr & 0xf30) == 0xa30)) {
50428                              UnallocatedA32(instr);
50429                              return;
50430                            }
50431                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50432                            if (dt.Is(kDataTypeValueInvalid)) {
50433                              UnallocatedA32(instr);
50434                              return;
50435                            }
50436                            Alignment align =
50437                                Align_align_5_Decode((instr >> 4) & 0x3);
50438                            if (dt.Is(kDataTypeValueInvalid) ||
50439                                align.Is(kBadAlignment)) {
50440                              UnallocatedA32(instr);
50441                              return;
50442                            }
50443                            unsigned first = ExtractDRegister(instr, 22, 12);
50444                            unsigned length;
50445                            SpacingType spacing = kSingle;
50446                            switch ((instr >> 8) & 0xf) {
50447                              default:
50448                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50449                              case 0x7:
50450                                length = 1;
50451                                break;
50452                              case 0xa:
50453                                length = 2;
50454                                break;
50455                              case 0x6:
50456                                length = 3;
50457                                break;
50458                              case 0x2:
50459                                length = 4;
50460                                break;
50461                            }
50462                            unsigned last = first + length - 1;
50463                            TransferType transfer = kMultipleLanes;
50464                            unsigned rn = (instr >> 16) & 0xf;
50465                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50466                            vst1(al,
50467                                 dt,
50468                                 NeonRegisterList(DRegister(first),
50469                                                  DRegister(last),
50470                                                  spacing,
50471                                                  transfer),
50472                                 AlignedMemOperand(Register(rn),
50473                                                   align,
50474                                                   Offset));
50475                            break;
50476                          }
50477                          case 0x00000800: {
50478                            // 0xf400080d
50479                            if (((instr & 0xe30) == 0x830)) {
50480                              UnallocatedA32(instr);
50481                              return;
50482                            }
50483                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50484                            if (dt.Is(kDataTypeValueInvalid)) {
50485                              UnallocatedA32(instr);
50486                              return;
50487                            }
50488                            Alignment align =
50489                                Align_align_2_Decode((instr >> 4) & 0x3);
50490                            if (dt.Is(kDataTypeValueInvalid) ||
50491                                align.Is(kBadAlignment)) {
50492                              UnallocatedA32(instr);
50493                              return;
50494                            }
50495                            unsigned first = ExtractDRegister(instr, 22, 12);
50496                            unsigned length;
50497                            SpacingType spacing;
50498                            switch ((instr >> 8) & 0xf) {
50499                              default:
50500                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50501                              case 0x8:
50502                                length = 2;
50503                                spacing = kSingle;
50504                                break;
50505                              case 0x9:
50506                                length = 2;
50507                                spacing = kDouble;
50508                                break;
50509                              case 0x3:
50510                                length = 4;
50511                                spacing = kSingle;
50512                                break;
50513                            }
50514                            unsigned last =
50515                                first +
50516                                (length - 1) * (spacing == kSingle ? 1 : 2);
50517                            TransferType transfer = kMultipleLanes;
50518                            unsigned rn = (instr >> 16) & 0xf;
50519                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50520                            vst2(al,
50521                                 dt,
50522                                 NeonRegisterList(DRegister(first),
50523                                                  DRegister(last),
50524                                                  spacing,
50525                                                  transfer),
50526                                 AlignedMemOperand(Register(rn),
50527                                                   align,
50528                                                   Offset));
50529                            break;
50530                          }
50531                          case 0x00000900: {
50532                            // 0xf400090d
50533                            if (((instr & 0xe30) == 0x830)) {
50534                              UnallocatedA32(instr);
50535                              return;
50536                            }
50537                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50538                            if (dt.Is(kDataTypeValueInvalid)) {
50539                              UnallocatedA32(instr);
50540                              return;
50541                            }
50542                            Alignment align =
50543                                Align_align_2_Decode((instr >> 4) & 0x3);
50544                            if (dt.Is(kDataTypeValueInvalid) ||
50545                                align.Is(kBadAlignment)) {
50546                              UnallocatedA32(instr);
50547                              return;
50548                            }
50549                            unsigned first = ExtractDRegister(instr, 22, 12);
50550                            unsigned length;
50551                            SpacingType spacing;
50552                            switch ((instr >> 8) & 0xf) {
50553                              default:
50554                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50555                              case 0x8:
50556                                length = 2;
50557                                spacing = kSingle;
50558                                break;
50559                              case 0x9:
50560                                length = 2;
50561                                spacing = kDouble;
50562                                break;
50563                              case 0x3:
50564                                length = 4;
50565                                spacing = kSingle;
50566                                break;
50567                            }
50568                            unsigned last =
50569                                first +
50570                                (length - 1) * (spacing == kSingle ? 1 : 2);
50571                            TransferType transfer = kMultipleLanes;
50572                            unsigned rn = (instr >> 16) & 0xf;
50573                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50574                            vst2(al,
50575                                 dt,
50576                                 NeonRegisterList(DRegister(first),
50577                                                  DRegister(last),
50578                                                  spacing,
50579                                                  transfer),
50580                                 AlignedMemOperand(Register(rn),
50581                                                   align,
50582                                                   Offset));
50583                            break;
50584                          }
50585                          case 0x00000a00: {
50586                            // 0xf4000a0d
50587                            if (((instr & 0xe20) == 0x620) ||
50588                                ((instr & 0xf30) == 0xa30)) {
50589                              UnallocatedA32(instr);
50590                              return;
50591                            }
50592                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50593                            if (dt.Is(kDataTypeValueInvalid)) {
50594                              UnallocatedA32(instr);
50595                              return;
50596                            }
50597                            Alignment align =
50598                                Align_align_5_Decode((instr >> 4) & 0x3);
50599                            if (dt.Is(kDataTypeValueInvalid) ||
50600                                align.Is(kBadAlignment)) {
50601                              UnallocatedA32(instr);
50602                              return;
50603                            }
50604                            unsigned first = ExtractDRegister(instr, 22, 12);
50605                            unsigned length;
50606                            SpacingType spacing = kSingle;
50607                            switch ((instr >> 8) & 0xf) {
50608                              default:
50609                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
50610                              case 0x7:
50611                                length = 1;
50612                                break;
50613                              case 0xa:
50614                                length = 2;
50615                                break;
50616                              case 0x6:
50617                                length = 3;
50618                                break;
50619                              case 0x2:
50620                                length = 4;
50621                                break;
50622                            }
50623                            unsigned last = first + length - 1;
50624                            TransferType transfer = kMultipleLanes;
50625                            unsigned rn = (instr >> 16) & 0xf;
50626                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50627                            vst1(al,
50628                                 dt,
50629                                 NeonRegisterList(DRegister(first),
50630                                                  DRegister(last),
50631                                                  spacing,
50632                                                  transfer),
50633                                 AlignedMemOperand(Register(rn),
50634                                                   align,
50635                                                   Offset));
50636                            break;
50637                          }
50638                          default:
50639                            UnallocatedA32(instr);
50640                            break;
50641                        }
50642                        break;
50643                      }
50644                    }
50645                    break;
50646                  }
50647                  default: {
50648                    switch (instr & 0x00000f00) {
50649                      case 0x00000000: {
50650                        // 0xf4000000
50651                        if (((instr & 0xd) == 0xd)) {
50652                          UnallocatedA32(instr);
50653                          return;
50654                        }
50655                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50656                        if (dt.Is(kDataTypeValueInvalid)) {
50657                          UnallocatedA32(instr);
50658                          return;
50659                        }
50660                        Alignment align =
50661                            Align_align_4_Decode((instr >> 4) & 0x3);
50662                        if (dt.Is(kDataTypeValueInvalid) ||
50663                            align.Is(kBadAlignment)) {
50664                          UnallocatedA32(instr);
50665                          return;
50666                        }
50667                        unsigned first = ExtractDRegister(instr, 22, 12);
50668                        unsigned length;
50669                        SpacingType spacing;
50670                        switch ((instr >> 8) & 0xf) {
50671                          default:
50672                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
50673                          case 0x0:
50674                            length = 4;
50675                            spacing = kSingle;
50676                            break;
50677                          case 0x1:
50678                            length = 4;
50679                            spacing = kDouble;
50680                            break;
50681                        }
50682                        unsigned last =
50683                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
50684                        TransferType transfer = kMultipleLanes;
50685                        unsigned rn = (instr >> 16) & 0xf;
50686                        unsigned rm = instr & 0xf;
50687                        // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50688                        vst4(al,
50689                             dt,
50690                             NeonRegisterList(DRegister(first),
50691                                              DRegister(last),
50692                                              spacing,
50693                                              transfer),
50694                             AlignedMemOperand(Register(rn),
50695                                               align,
50696                                               Register(rm),
50697                                               PostIndex));
50698                        break;
50699                      }
50700                      case 0x00000100: {
50701                        // 0xf4000100
50702                        if (((instr & 0xd) == 0xd)) {
50703                          UnallocatedA32(instr);
50704                          return;
50705                        }
50706                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50707                        if (dt.Is(kDataTypeValueInvalid)) {
50708                          UnallocatedA32(instr);
50709                          return;
50710                        }
50711                        Alignment align =
50712                            Align_align_4_Decode((instr >> 4) & 0x3);
50713                        if (dt.Is(kDataTypeValueInvalid) ||
50714                            align.Is(kBadAlignment)) {
50715                          UnallocatedA32(instr);
50716                          return;
50717                        }
50718                        unsigned first = ExtractDRegister(instr, 22, 12);
50719                        unsigned length;
50720                        SpacingType spacing;
50721                        switch ((instr >> 8) & 0xf) {
50722                          default:
50723                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
50724                          case 0x0:
50725                            length = 4;
50726                            spacing = kSingle;
50727                            break;
50728                          case 0x1:
50729                            length = 4;
50730                            spacing = kDouble;
50731                            break;
50732                        }
50733                        unsigned last =
50734                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
50735                        TransferType transfer = kMultipleLanes;
50736                        unsigned rn = (instr >> 16) & 0xf;
50737                        unsigned rm = instr & 0xf;
50738                        // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50739                        vst4(al,
50740                             dt,
50741                             NeonRegisterList(DRegister(first),
50742                                              DRegister(last),
50743                                              spacing,
50744                                              transfer),
50745                             AlignedMemOperand(Register(rn),
50746                                               align,
50747                                               Register(rm),
50748                                               PostIndex));
50749                        break;
50750                      }
50751                      case 0x00000200: {
50752                        // 0xf4000200
50753                        if (((instr & 0xd) == 0xd) ||
50754                            ((instr & 0xe20) == 0x620) ||
50755                            ((instr & 0xf30) == 0xa30)) {
50756                          UnallocatedA32(instr);
50757                          return;
50758                        }
50759                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50760                        if (dt.Is(kDataTypeValueInvalid)) {
50761                          UnallocatedA32(instr);
50762                          return;
50763                        }
50764                        Alignment align =
50765                            Align_align_5_Decode((instr >> 4) & 0x3);
50766                        if (dt.Is(kDataTypeValueInvalid) ||
50767                            align.Is(kBadAlignment)) {
50768                          UnallocatedA32(instr);
50769                          return;
50770                        }
50771                        unsigned first = ExtractDRegister(instr, 22, 12);
50772                        unsigned length;
50773                        SpacingType spacing = kSingle;
50774                        switch ((instr >> 8) & 0xf) {
50775                          default:
50776                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
50777                          case 0x7:
50778                            length = 1;
50779                            break;
50780                          case 0xa:
50781                            length = 2;
50782                            break;
50783                          case 0x6:
50784                            length = 3;
50785                            break;
50786                          case 0x2:
50787                            length = 4;
50788                            break;
50789                        }
50790                        unsigned last = first + length - 1;
50791                        TransferType transfer = kMultipleLanes;
50792                        unsigned rn = (instr >> 16) & 0xf;
50793                        unsigned rm = instr & 0xf;
50794                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50795                        vst1(al,
50796                             dt,
50797                             NeonRegisterList(DRegister(first),
50798                                              DRegister(last),
50799                                              spacing,
50800                                              transfer),
50801                             AlignedMemOperand(Register(rn),
50802                                               align,
50803                                               Register(rm),
50804                                               PostIndex));
50805                        break;
50806                      }
50807                      case 0x00000300: {
50808                        // 0xf4000300
50809                        if (((instr & 0xd) == 0xd) ||
50810                            ((instr & 0xe30) == 0x830)) {
50811                          UnallocatedA32(instr);
50812                          return;
50813                        }
50814                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50815                        if (dt.Is(kDataTypeValueInvalid)) {
50816                          UnallocatedA32(instr);
50817                          return;
50818                        }
50819                        Alignment align =
50820                            Align_align_2_Decode((instr >> 4) & 0x3);
50821                        if (dt.Is(kDataTypeValueInvalid) ||
50822                            align.Is(kBadAlignment)) {
50823                          UnallocatedA32(instr);
50824                          return;
50825                        }
50826                        unsigned first = ExtractDRegister(instr, 22, 12);
50827                        unsigned length;
50828                        SpacingType spacing;
50829                        switch ((instr >> 8) & 0xf) {
50830                          default:
50831                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
50832                          case 0x8:
50833                            length = 2;
50834                            spacing = kSingle;
50835                            break;
50836                          case 0x9:
50837                            length = 2;
50838                            spacing = kDouble;
50839                            break;
50840                          case 0x3:
50841                            length = 4;
50842                            spacing = kSingle;
50843                            break;
50844                        }
50845                        unsigned last =
50846                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
50847                        TransferType transfer = kMultipleLanes;
50848                        unsigned rn = (instr >> 16) & 0xf;
50849                        unsigned rm = instr & 0xf;
50850                        // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50851                        vst2(al,
50852                             dt,
50853                             NeonRegisterList(DRegister(first),
50854                                              DRegister(last),
50855                                              spacing,
50856                                              transfer),
50857                             AlignedMemOperand(Register(rn),
50858                                               align,
50859                                               Register(rm),
50860                                               PostIndex));
50861                        break;
50862                      }
50863                      case 0x00000400: {
50864                        // 0xf4000400
50865                        if (((instr & 0xd) == 0xd) ||
50866                            ((instr & 0x20) == 0x20)) {
50867                          UnallocatedA32(instr);
50868                          return;
50869                        }
50870                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50871                        if (dt.Is(kDataTypeValueInvalid)) {
50872                          UnallocatedA32(instr);
50873                          return;
50874                        }
50875                        Alignment align =
50876                            Align_align_3_Decode((instr >> 4) & 0x3);
50877                        if (dt.Is(kDataTypeValueInvalid) ||
50878                            align.Is(kBadAlignment)) {
50879                          UnallocatedA32(instr);
50880                          return;
50881                        }
50882                        unsigned first = ExtractDRegister(instr, 22, 12);
50883                        unsigned length;
50884                        SpacingType spacing;
50885                        switch ((instr >> 8) & 0xf) {
50886                          default:
50887                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
50888                          case 0x4:
50889                            length = 3;
50890                            spacing = kSingle;
50891                            break;
50892                          case 0x5:
50893                            length = 3;
50894                            spacing = kDouble;
50895                            break;
50896                        }
50897                        unsigned last =
50898                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
50899                        TransferType transfer = kMultipleLanes;
50900                        unsigned rn = (instr >> 16) & 0xf;
50901                        unsigned rm = instr & 0xf;
50902                        // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50903                        vst3(al,
50904                             dt,
50905                             NeonRegisterList(DRegister(first),
50906                                              DRegister(last),
50907                                              spacing,
50908                                              transfer),
50909                             AlignedMemOperand(Register(rn),
50910                                               align,
50911                                               Register(rm),
50912                                               PostIndex));
50913                        break;
50914                      }
50915                      case 0x00000500: {
50916                        // 0xf4000500
50917                        if (((instr & 0xd) == 0xd) ||
50918                            ((instr & 0x20) == 0x20)) {
50919                          UnallocatedA32(instr);
50920                          return;
50921                        }
50922                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50923                        if (dt.Is(kDataTypeValueInvalid)) {
50924                          UnallocatedA32(instr);
50925                          return;
50926                        }
50927                        Alignment align =
50928                            Align_align_3_Decode((instr >> 4) & 0x3);
50929                        if (dt.Is(kDataTypeValueInvalid) ||
50930                            align.Is(kBadAlignment)) {
50931                          UnallocatedA32(instr);
50932                          return;
50933                        }
50934                        unsigned first = ExtractDRegister(instr, 22, 12);
50935                        unsigned length;
50936                        SpacingType spacing;
50937                        switch ((instr >> 8) & 0xf) {
50938                          default:
50939                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
50940                          case 0x4:
50941                            length = 3;
50942                            spacing = kSingle;
50943                            break;
50944                          case 0x5:
50945                            length = 3;
50946                            spacing = kDouble;
50947                            break;
50948                        }
50949                        unsigned last =
50950                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
50951                        TransferType transfer = kMultipleLanes;
50952                        unsigned rn = (instr >> 16) & 0xf;
50953                        unsigned rm = instr & 0xf;
50954                        // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
50955                        vst3(al,
50956                             dt,
50957                             NeonRegisterList(DRegister(first),
50958                                              DRegister(last),
50959                                              spacing,
50960                                              transfer),
50961                             AlignedMemOperand(Register(rn),
50962                                               align,
50963                                               Register(rm),
50964                                               PostIndex));
50965                        break;
50966                      }
50967                      case 0x00000600: {
50968                        // 0xf4000600
50969                        if (((instr & 0xd) == 0xd) ||
50970                            ((instr & 0xe20) == 0x620) ||
50971                            ((instr & 0xf30) == 0xa30)) {
50972                          UnallocatedA32(instr);
50973                          return;
50974                        }
50975                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50976                        if (dt.Is(kDataTypeValueInvalid)) {
50977                          UnallocatedA32(instr);
50978                          return;
50979                        }
50980                        Alignment align =
50981                            Align_align_5_Decode((instr >> 4) & 0x3);
50982                        if (dt.Is(kDataTypeValueInvalid) ||
50983                            align.Is(kBadAlignment)) {
50984                          UnallocatedA32(instr);
50985                          return;
50986                        }
50987                        unsigned first = ExtractDRegister(instr, 22, 12);
50988                        unsigned length;
50989                        SpacingType spacing = kSingle;
50990                        switch ((instr >> 8) & 0xf) {
50991                          default:
50992                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
50993                          case 0x7:
50994                            length = 1;
50995                            break;
50996                          case 0xa:
50997                            length = 2;
50998                            break;
50999                          case 0x6:
51000                            length = 3;
51001                            break;
51002                          case 0x2:
51003                            length = 4;
51004                            break;
51005                        }
51006                        unsigned last = first + length - 1;
51007                        TransferType transfer = kMultipleLanes;
51008                        unsigned rn = (instr >> 16) & 0xf;
51009                        unsigned rm = instr & 0xf;
51010                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51011                        vst1(al,
51012                             dt,
51013                             NeonRegisterList(DRegister(first),
51014                                              DRegister(last),
51015                                              spacing,
51016                                              transfer),
51017                             AlignedMemOperand(Register(rn),
51018                                               align,
51019                                               Register(rm),
51020                                               PostIndex));
51021                        break;
51022                      }
51023                      case 0x00000700: {
51024                        // 0xf4000700
51025                        if (((instr & 0xd) == 0xd) ||
51026                            ((instr & 0xe20) == 0x620) ||
51027                            ((instr & 0xf30) == 0xa30)) {
51028                          UnallocatedA32(instr);
51029                          return;
51030                        }
51031                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51032                        if (dt.Is(kDataTypeValueInvalid)) {
51033                          UnallocatedA32(instr);
51034                          return;
51035                        }
51036                        Alignment align =
51037                            Align_align_5_Decode((instr >> 4) & 0x3);
51038                        if (dt.Is(kDataTypeValueInvalid) ||
51039                            align.Is(kBadAlignment)) {
51040                          UnallocatedA32(instr);
51041                          return;
51042                        }
51043                        unsigned first = ExtractDRegister(instr, 22, 12);
51044                        unsigned length;
51045                        SpacingType spacing = kSingle;
51046                        switch ((instr >> 8) & 0xf) {
51047                          default:
51048                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51049                          case 0x7:
51050                            length = 1;
51051                            break;
51052                          case 0xa:
51053                            length = 2;
51054                            break;
51055                          case 0x6:
51056                            length = 3;
51057                            break;
51058                          case 0x2:
51059                            length = 4;
51060                            break;
51061                        }
51062                        unsigned last = first + length - 1;
51063                        TransferType transfer = kMultipleLanes;
51064                        unsigned rn = (instr >> 16) & 0xf;
51065                        unsigned rm = instr & 0xf;
51066                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51067                        vst1(al,
51068                             dt,
51069                             NeonRegisterList(DRegister(first),
51070                                              DRegister(last),
51071                                              spacing,
51072                                              transfer),
51073                             AlignedMemOperand(Register(rn),
51074                                               align,
51075                                               Register(rm),
51076                                               PostIndex));
51077                        break;
51078                      }
51079                      case 0x00000800: {
51080                        // 0xf4000800
51081                        if (((instr & 0xd) == 0xd) ||
51082                            ((instr & 0xe30) == 0x830)) {
51083                          UnallocatedA32(instr);
51084                          return;
51085                        }
51086                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51087                        if (dt.Is(kDataTypeValueInvalid)) {
51088                          UnallocatedA32(instr);
51089                          return;
51090                        }
51091                        Alignment align =
51092                            Align_align_2_Decode((instr >> 4) & 0x3);
51093                        if (dt.Is(kDataTypeValueInvalid) ||
51094                            align.Is(kBadAlignment)) {
51095                          UnallocatedA32(instr);
51096                          return;
51097                        }
51098                        unsigned first = ExtractDRegister(instr, 22, 12);
51099                        unsigned length;
51100                        SpacingType spacing;
51101                        switch ((instr >> 8) & 0xf) {
51102                          default:
51103                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51104                          case 0x8:
51105                            length = 2;
51106                            spacing = kSingle;
51107                            break;
51108                          case 0x9:
51109                            length = 2;
51110                            spacing = kDouble;
51111                            break;
51112                          case 0x3:
51113                            length = 4;
51114                            spacing = kSingle;
51115                            break;
51116                        }
51117                        unsigned last =
51118                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
51119                        TransferType transfer = kMultipleLanes;
51120                        unsigned rn = (instr >> 16) & 0xf;
51121                        unsigned rm = instr & 0xf;
51122                        // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51123                        vst2(al,
51124                             dt,
51125                             NeonRegisterList(DRegister(first),
51126                                              DRegister(last),
51127                                              spacing,
51128                                              transfer),
51129                             AlignedMemOperand(Register(rn),
51130                                               align,
51131                                               Register(rm),
51132                                               PostIndex));
51133                        break;
51134                      }
51135                      case 0x00000900: {
51136                        // 0xf4000900
51137                        if (((instr & 0xd) == 0xd) ||
51138                            ((instr & 0xe30) == 0x830)) {
51139                          UnallocatedA32(instr);
51140                          return;
51141                        }
51142                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51143                        if (dt.Is(kDataTypeValueInvalid)) {
51144                          UnallocatedA32(instr);
51145                          return;
51146                        }
51147                        Alignment align =
51148                            Align_align_2_Decode((instr >> 4) & 0x3);
51149                        if (dt.Is(kDataTypeValueInvalid) ||
51150                            align.Is(kBadAlignment)) {
51151                          UnallocatedA32(instr);
51152                          return;
51153                        }
51154                        unsigned first = ExtractDRegister(instr, 22, 12);
51155                        unsigned length;
51156                        SpacingType spacing;
51157                        switch ((instr >> 8) & 0xf) {
51158                          default:
51159                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51160                          case 0x8:
51161                            length = 2;
51162                            spacing = kSingle;
51163                            break;
51164                          case 0x9:
51165                            length = 2;
51166                            spacing = kDouble;
51167                            break;
51168                          case 0x3:
51169                            length = 4;
51170                            spacing = kSingle;
51171                            break;
51172                        }
51173                        unsigned last =
51174                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
51175                        TransferType transfer = kMultipleLanes;
51176                        unsigned rn = (instr >> 16) & 0xf;
51177                        unsigned rm = instr & 0xf;
51178                        // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51179                        vst2(al,
51180                             dt,
51181                             NeonRegisterList(DRegister(first),
51182                                              DRegister(last),
51183                                              spacing,
51184                                              transfer),
51185                             AlignedMemOperand(Register(rn),
51186                                               align,
51187                                               Register(rm),
51188                                               PostIndex));
51189                        break;
51190                      }
51191                      case 0x00000a00: {
51192                        // 0xf4000a00
51193                        if (((instr & 0xd) == 0xd) ||
51194                            ((instr & 0xe20) == 0x620) ||
51195                            ((instr & 0xf30) == 0xa30)) {
51196                          UnallocatedA32(instr);
51197                          return;
51198                        }
51199                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51200                        if (dt.Is(kDataTypeValueInvalid)) {
51201                          UnallocatedA32(instr);
51202                          return;
51203                        }
51204                        Alignment align =
51205                            Align_align_5_Decode((instr >> 4) & 0x3);
51206                        if (dt.Is(kDataTypeValueInvalid) ||
51207                            align.Is(kBadAlignment)) {
51208                          UnallocatedA32(instr);
51209                          return;
51210                        }
51211                        unsigned first = ExtractDRegister(instr, 22, 12);
51212                        unsigned length;
51213                        SpacingType spacing = kSingle;
51214                        switch ((instr >> 8) & 0xf) {
51215                          default:
51216                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
51217                          case 0x7:
51218                            length = 1;
51219                            break;
51220                          case 0xa:
51221                            length = 2;
51222                            break;
51223                          case 0x6:
51224                            length = 3;
51225                            break;
51226                          case 0x2:
51227                            length = 4;
51228                            break;
51229                        }
51230                        unsigned last = first + length - 1;
51231                        TransferType transfer = kMultipleLanes;
51232                        unsigned rn = (instr >> 16) & 0xf;
51233                        unsigned rm = instr & 0xf;
51234                        // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51235                        vst1(al,
51236                             dt,
51237                             NeonRegisterList(DRegister(first),
51238                                              DRegister(last),
51239                                              spacing,
51240                                              transfer),
51241                             AlignedMemOperand(Register(rn),
51242                                               align,
51243                                               Register(rm),
51244                                               PostIndex));
51245                        break;
51246                      }
51247                      default:
51248                        UnallocatedA32(instr);
51249                        break;
51250                    }
51251                    break;
51252                  }
51253                }
51254                break;
51255              }
51256              case 0x00800000: {
51257                // 0xf4800000
51258                switch (instr & 0x00000300) {
51259                  case 0x00000000: {
51260                    // 0xf4800000
51261                    switch (instr & 0x00000c00) {
51262                      case 0x00000c00: {
51263                        // 0xf4800c00
51264                        UnallocatedA32(instr);
51265                        break;
51266                      }
51267                      default: {
51268                        switch (instr & 0x0000000d) {
51269                          case 0x0000000d: {
51270                            // 0xf480000d
51271                            switch (instr & 0x00000002) {
51272                              case 0x00000000: {
51273                                // 0xf480000d
51274                                if (((instr & 0xc00) == 0xc00)) {
51275                                  UnallocatedA32(instr);
51276                                  return;
51277                                }
51278                                DataType dt =
51279                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51280                                if (dt.Is(kDataTypeValueInvalid)) {
51281                                  UnallocatedA32(instr);
51282                                  return;
51283                                }
51284                                DecodeNeonAndAlign decode_neon =
51285                                    Align_index_align_1_Decode((instr >> 4) &
51286                                                                   0xf,
51287                                                               dt);
51288                                if (!decode_neon.IsValid()) {
51289                                  UnallocatedA32(instr);
51290                                  return;
51291                                }
51292                                Alignment align = decode_neon.GetAlign();
51293                                int lane = decode_neon.GetLane();
51294                                SpacingType spacing = decode_neon.GetSpacing();
51295                                unsigned first =
51296                                    ExtractDRegister(instr, 22, 12);
51297                                unsigned length = 1;
51298                                unsigned last = first + length - 1;
51299                                unsigned rn = (instr >> 16) & 0xf;
51300                                // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51301                                vst1(al,
51302                                     dt,
51303                                     NeonRegisterList(DRegister(first),
51304                                                      DRegister(last),
51305                                                      spacing,
51306                                                      lane),
51307                                     AlignedMemOperand(Register(rn),
51308                                                       align,
51309                                                       PostIndex));
51310                                break;
51311                              }
51312                              case 0x00000002: {
51313                                // 0xf480000f
51314                                if (((instr & 0xc00) == 0xc00)) {
51315                                  UnallocatedA32(instr);
51316                                  return;
51317                                }
51318                                DataType dt =
51319                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51320                                if (dt.Is(kDataTypeValueInvalid)) {
51321                                  UnallocatedA32(instr);
51322                                  return;
51323                                }
51324                                DecodeNeonAndAlign decode_neon =
51325                                    Align_index_align_1_Decode((instr >> 4) &
51326                                                                   0xf,
51327                                                               dt);
51328                                if (!decode_neon.IsValid()) {
51329                                  UnallocatedA32(instr);
51330                                  return;
51331                                }
51332                                Alignment align = decode_neon.GetAlign();
51333                                int lane = decode_neon.GetLane();
51334                                SpacingType spacing = decode_neon.GetSpacing();
51335                                unsigned first =
51336                                    ExtractDRegister(instr, 22, 12);
51337                                unsigned length = 1;
51338                                unsigned last = first + length - 1;
51339                                unsigned rn = (instr >> 16) & 0xf;
51340                                // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51341                                vst1(al,
51342                                     dt,
51343                                     NeonRegisterList(DRegister(first),
51344                                                      DRegister(last),
51345                                                      spacing,
51346                                                      lane),
51347                                     AlignedMemOperand(Register(rn),
51348                                                       align,
51349                                                       Offset));
51350                                break;
51351                              }
51352                            }
51353                            break;
51354                          }
51355                          default: {
51356                            if (((instr & 0xc00) == 0xc00) ||
51357                                ((instr & 0xd) == 0xd)) {
51358                              UnallocatedA32(instr);
51359                              return;
51360                            }
51361                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51362                            if (dt.Is(kDataTypeValueInvalid)) {
51363                              UnallocatedA32(instr);
51364                              return;
51365                            }
51366                            DecodeNeonAndAlign decode_neon =
51367                                Align_index_align_1_Decode((instr >> 4) & 0xf,
51368                                                           dt);
51369                            if (!decode_neon.IsValid()) {
51370                              UnallocatedA32(instr);
51371                              return;
51372                            }
51373                            Alignment align = decode_neon.GetAlign();
51374                            int lane = decode_neon.GetLane();
51375                            SpacingType spacing = decode_neon.GetSpacing();
51376                            unsigned first = ExtractDRegister(instr, 22, 12);
51377                            unsigned length = 1;
51378                            unsigned last = first + length - 1;
51379                            unsigned rn = (instr >> 16) & 0xf;
51380                            unsigned rm = instr & 0xf;
51381                            // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51382                            vst1(al,
51383                                 dt,
51384                                 NeonRegisterList(DRegister(first),
51385                                                  DRegister(last),
51386                                                  spacing,
51387                                                  lane),
51388                                 AlignedMemOperand(Register(rn),
51389                                                   align,
51390                                                   Register(rm),
51391                                                   PostIndex));
51392                            break;
51393                          }
51394                        }
51395                        break;
51396                      }
51397                    }
51398                    break;
51399                  }
51400                  case 0x00000100: {
51401                    // 0xf4800100
51402                    switch (instr & 0x00000c00) {
51403                      case 0x00000c00: {
51404                        // 0xf4800d00
51405                        UnallocatedA32(instr);
51406                        break;
51407                      }
51408                      default: {
51409                        switch (instr & 0x0000000d) {
51410                          case 0x0000000d: {
51411                            // 0xf480010d
51412                            switch (instr & 0x00000002) {
51413                              case 0x00000000: {
51414                                // 0xf480010d
51415                                if (((instr & 0xc00) == 0xc00)) {
51416                                  UnallocatedA32(instr);
51417                                  return;
51418                                }
51419                                DataType dt =
51420                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51421                                if (dt.Is(kDataTypeValueInvalid)) {
51422                                  UnallocatedA32(instr);
51423                                  return;
51424                                }
51425                                DecodeNeonAndAlign decode_neon =
51426                                    Align_index_align_2_Decode((instr >> 4) &
51427                                                                   0xf,
51428                                                               dt);
51429                                if (!decode_neon.IsValid()) {
51430                                  UnallocatedA32(instr);
51431                                  return;
51432                                }
51433                                Alignment align = decode_neon.GetAlign();
51434                                int lane = decode_neon.GetLane();
51435                                SpacingType spacing = decode_neon.GetSpacing();
51436                                unsigned first =
51437                                    ExtractDRegister(instr, 22, 12);
51438                                unsigned length = 2;
51439                                unsigned last =
51440                                    first +
51441                                    (length - 1) * (spacing == kSingle ? 1 : 2);
51442                                unsigned rn = (instr >> 16) & 0xf;
51443                                // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51444                                vst2(al,
51445                                     dt,
51446                                     NeonRegisterList(DRegister(first),
51447                                                      DRegister(last),
51448                                                      spacing,
51449                                                      lane),
51450                                     AlignedMemOperand(Register(rn),
51451                                                       align,
51452                                                       PostIndex));
51453                                break;
51454                              }
51455                              case 0x00000002: {
51456                                // 0xf480010f
51457                                if (((instr & 0xc00) == 0xc00)) {
51458                                  UnallocatedA32(instr);
51459                                  return;
51460                                }
51461                                DataType dt =
51462                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51463                                if (dt.Is(kDataTypeValueInvalid)) {
51464                                  UnallocatedA32(instr);
51465                                  return;
51466                                }
51467                                DecodeNeonAndAlign decode_neon =
51468                                    Align_index_align_2_Decode((instr >> 4) &
51469                                                                   0xf,
51470                                                               dt);
51471                                if (!decode_neon.IsValid()) {
51472                                  UnallocatedA32(instr);
51473                                  return;
51474                                }
51475                                Alignment align = decode_neon.GetAlign();
51476                                int lane = decode_neon.GetLane();
51477                                SpacingType spacing = decode_neon.GetSpacing();
51478                                unsigned first =
51479                                    ExtractDRegister(instr, 22, 12);
51480                                unsigned length = 2;
51481                                unsigned last =
51482                                    first +
51483                                    (length - 1) * (spacing == kSingle ? 1 : 2);
51484                                unsigned rn = (instr >> 16) & 0xf;
51485                                // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51486                                vst2(al,
51487                                     dt,
51488                                     NeonRegisterList(DRegister(first),
51489                                                      DRegister(last),
51490                                                      spacing,
51491                                                      lane),
51492                                     AlignedMemOperand(Register(rn),
51493                                                       align,
51494                                                       Offset));
51495                                break;
51496                              }
51497                            }
51498                            break;
51499                          }
51500                          default: {
51501                            if (((instr & 0xc00) == 0xc00) ||
51502                                ((instr & 0xd) == 0xd)) {
51503                              UnallocatedA32(instr);
51504                              return;
51505                            }
51506                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51507                            if (dt.Is(kDataTypeValueInvalid)) {
51508                              UnallocatedA32(instr);
51509                              return;
51510                            }
51511                            DecodeNeonAndAlign decode_neon =
51512                                Align_index_align_2_Decode((instr >> 4) & 0xf,
51513                                                           dt);
51514                            if (!decode_neon.IsValid()) {
51515                              UnallocatedA32(instr);
51516                              return;
51517                            }
51518                            Alignment align = decode_neon.GetAlign();
51519                            int lane = decode_neon.GetLane();
51520                            SpacingType spacing = decode_neon.GetSpacing();
51521                            unsigned first = ExtractDRegister(instr, 22, 12);
51522                            unsigned length = 2;
51523                            unsigned last =
51524                                first +
51525                                (length - 1) * (spacing == kSingle ? 1 : 2);
51526                            unsigned rn = (instr >> 16) & 0xf;
51527                            unsigned rm = instr & 0xf;
51528                            // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51529                            vst2(al,
51530                                 dt,
51531                                 NeonRegisterList(DRegister(first),
51532                                                  DRegister(last),
51533                                                  spacing,
51534                                                  lane),
51535                                 AlignedMemOperand(Register(rn),
51536                                                   align,
51537                                                   Register(rm),
51538                                                   PostIndex));
51539                            break;
51540                          }
51541                        }
51542                        break;
51543                      }
51544                    }
51545                    break;
51546                  }
51547                  case 0x00000200: {
51548                    // 0xf4800200
51549                    switch (instr & 0x00000c30) {
51550                      case 0x00000010: {
51551                        // 0xf4800210
51552                        UnallocatedA32(instr);
51553                        break;
51554                      }
51555                      case 0x00000030: {
51556                        // 0xf4800230
51557                        UnallocatedA32(instr);
51558                        break;
51559                      }
51560                      case 0x00000410: {
51561                        // 0xf4800610
51562                        UnallocatedA32(instr);
51563                        break;
51564                      }
51565                      case 0x00000430: {
51566                        // 0xf4800630
51567                        UnallocatedA32(instr);
51568                        break;
51569                      }
51570                      case 0x00000810: {
51571                        // 0xf4800a10
51572                        UnallocatedA32(instr);
51573                        break;
51574                      }
51575                      case 0x00000820: {
51576                        // 0xf4800a20
51577                        UnallocatedA32(instr);
51578                        break;
51579                      }
51580                      case 0x00000830: {
51581                        // 0xf4800a30
51582                        UnallocatedA32(instr);
51583                        break;
51584                      }
51585                      case 0x00000c00: {
51586                        // 0xf4800e00
51587                        UnallocatedA32(instr);
51588                        break;
51589                      }
51590                      case 0x00000c10: {
51591                        // 0xf4800e10
51592                        UnallocatedA32(instr);
51593                        break;
51594                      }
51595                      case 0x00000c20: {
51596                        // 0xf4800e20
51597                        UnallocatedA32(instr);
51598                        break;
51599                      }
51600                      case 0x00000c30: {
51601                        // 0xf4800e30
51602                        UnallocatedA32(instr);
51603                        break;
51604                      }
51605                      default: {
51606                        switch (instr & 0x0000000d) {
51607                          case 0x0000000d: {
51608                            // 0xf480020d
51609                            switch (instr & 0x00000002) {
51610                              case 0x00000000: {
51611                                // 0xf480020d
51612                                if (((instr & 0xc00) == 0xc00) ||
51613                                    ((instr & 0x810) == 0x10) ||
51614                                    ((instr & 0xc30) == 0x810) ||
51615                                    ((instr & 0xc30) == 0x820) ||
51616                                    ((instr & 0xc30) == 0x830)) {
51617                                  UnallocatedA32(instr);
51618                                  return;
51619                                }
51620                                DataType dt =
51621                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51622                                if (dt.Is(kDataTypeValueInvalid)) {
51623                                  UnallocatedA32(instr);
51624                                  return;
51625                                }
51626                                DecodeNeon decode_neon =
51627                                    Index_1_Decode((instr >> 4) & 0xf, dt);
51628                                if (!decode_neon.IsValid()) {
51629                                  UnallocatedA32(instr);
51630                                  return;
51631                                }
51632                                int lane = decode_neon.GetLane();
51633                                SpacingType spacing = decode_neon.GetSpacing();
51634                                unsigned first =
51635                                    ExtractDRegister(instr, 22, 12);
51636                                unsigned length = 3;
51637                                unsigned last =
51638                                    first +
51639                                    (length - 1) * (spacing == kSingle ? 1 : 2);
51640                                unsigned rn = (instr >> 16) & 0xf;
51641                                // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
51642                                vst3(al,
51643                                     dt,
51644                                     NeonRegisterList(DRegister(first),
51645                                                      DRegister(last),
51646                                                      spacing,
51647                                                      lane),
51648                                     MemOperand(Register(rn), PostIndex));
51649                                break;
51650                              }
51651                              case 0x00000002: {
51652                                // 0xf480020f
51653                                if (((instr & 0xc00) == 0xc00) ||
51654                                    ((instr & 0x810) == 0x10) ||
51655                                    ((instr & 0xc30) == 0x810) ||
51656                                    ((instr & 0xc30) == 0x820) ||
51657                                    ((instr & 0xc30) == 0x830)) {
51658                                  UnallocatedA32(instr);
51659                                  return;
51660                                }
51661                                DataType dt =
51662                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51663                                if (dt.Is(kDataTypeValueInvalid)) {
51664                                  UnallocatedA32(instr);
51665                                  return;
51666                                }
51667                                DecodeNeon decode_neon =
51668                                    Index_1_Decode((instr >> 4) & 0xf, dt);
51669                                if (!decode_neon.IsValid()) {
51670                                  UnallocatedA32(instr);
51671                                  return;
51672                                }
51673                                int lane = decode_neon.GetLane();
51674                                SpacingType spacing = decode_neon.GetSpacing();
51675                                unsigned first =
51676                                    ExtractDRegister(instr, 22, 12);
51677                                unsigned length = 3;
51678                                unsigned last =
51679                                    first +
51680                                    (length - 1) * (spacing == kSingle ? 1 : 2);
51681                                unsigned rn = (instr >> 16) & 0xf;
51682                                // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
51683                                vst3(al,
51684                                     dt,
51685                                     NeonRegisterList(DRegister(first),
51686                                                      DRegister(last),
51687                                                      spacing,
51688                                                      lane),
51689                                     MemOperand(Register(rn), Offset));
51690                                break;
51691                              }
51692                            }
51693                            break;
51694                          }
51695                          default: {
51696                            if (((instr & 0xc00) == 0xc00) ||
51697                                ((instr & 0xd) == 0xd) ||
51698                                ((instr & 0x810) == 0x10) ||
51699                                ((instr & 0xc30) == 0x810) ||
51700                                ((instr & 0xc30) == 0x820) ||
51701                                ((instr & 0xc30) == 0x830)) {
51702                              UnallocatedA32(instr);
51703                              return;
51704                            }
51705                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51706                            if (dt.Is(kDataTypeValueInvalid)) {
51707                              UnallocatedA32(instr);
51708                              return;
51709                            }
51710                            DecodeNeon decode_neon =
51711                                Index_1_Decode((instr >> 4) & 0xf, dt);
51712                            if (!decode_neon.IsValid()) {
51713                              UnallocatedA32(instr);
51714                              return;
51715                            }
51716                            int lane = decode_neon.GetLane();
51717                            SpacingType spacing = decode_neon.GetSpacing();
51718                            unsigned first = ExtractDRegister(instr, 22, 12);
51719                            unsigned length = 3;
51720                            unsigned last =
51721                                first +
51722                                (length - 1) * (spacing == kSingle ? 1 : 2);
51723                            unsigned rn = (instr >> 16) & 0xf;
51724                            Sign sign(plus);
51725                            unsigned rm = instr & 0xf;
51726                            // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
51727                            vst3(al,
51728                                 dt,
51729                                 NeonRegisterList(DRegister(first),
51730                                                  DRegister(last),
51731                                                  spacing,
51732                                                  lane),
51733                                 MemOperand(Register(rn),
51734                                            sign,
51735                                            Register(rm),
51736                                            PostIndex));
51737                            break;
51738                          }
51739                        }
51740                        break;
51741                      }
51742                    }
51743                    break;
51744                  }
51745                  case 0x00000300: {
51746                    // 0xf4800300
51747                    switch (instr & 0x00000c00) {
51748                      case 0x00000c00: {
51749                        // 0xf4800f00
51750                        UnallocatedA32(instr);
51751                        break;
51752                      }
51753                      default: {
51754                        switch (instr & 0x0000000d) {
51755                          case 0x0000000d: {
51756                            // 0xf480030d
51757                            switch (instr & 0x00000002) {
51758                              case 0x00000000: {
51759                                // 0xf480030d
51760                                if (((instr & 0xc00) == 0xc00)) {
51761                                  UnallocatedA32(instr);
51762                                  return;
51763                                }
51764                                DataType dt =
51765                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51766                                if (dt.Is(kDataTypeValueInvalid)) {
51767                                  UnallocatedA32(instr);
51768                                  return;
51769                                }
51770                                DecodeNeonAndAlign decode_neon =
51771                                    Align_index_align_3_Decode((instr >> 4) &
51772                                                                   0xf,
51773                                                               dt);
51774                                if (!decode_neon.IsValid()) {
51775                                  UnallocatedA32(instr);
51776                                  return;
51777                                }
51778                                Alignment align = decode_neon.GetAlign();
51779                                int lane = decode_neon.GetLane();
51780                                SpacingType spacing = decode_neon.GetSpacing();
51781                                unsigned first =
51782                                    ExtractDRegister(instr, 22, 12);
51783                                unsigned length = 4;
51784                                unsigned last =
51785                                    first +
51786                                    (length - 1) * (spacing == kSingle ? 1 : 2);
51787                                unsigned rn = (instr >> 16) & 0xf;
51788                                // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51789                                vst4(al,
51790                                     dt,
51791                                     NeonRegisterList(DRegister(first),
51792                                                      DRegister(last),
51793                                                      spacing,
51794                                                      lane),
51795                                     AlignedMemOperand(Register(rn),
51796                                                       align,
51797                                                       PostIndex));
51798                                break;
51799                              }
51800                              case 0x00000002: {
51801                                // 0xf480030f
51802                                if (((instr & 0xc00) == 0xc00)) {
51803                                  UnallocatedA32(instr);
51804                                  return;
51805                                }
51806                                DataType dt =
51807                                    Dt_size_7_Decode((instr >> 10) & 0x3);
51808                                if (dt.Is(kDataTypeValueInvalid)) {
51809                                  UnallocatedA32(instr);
51810                                  return;
51811                                }
51812                                DecodeNeonAndAlign decode_neon =
51813                                    Align_index_align_3_Decode((instr >> 4) &
51814                                                                   0xf,
51815                                                               dt);
51816                                if (!decode_neon.IsValid()) {
51817                                  UnallocatedA32(instr);
51818                                  return;
51819                                }
51820                                Alignment align = decode_neon.GetAlign();
51821                                int lane = decode_neon.GetLane();
51822                                SpacingType spacing = decode_neon.GetSpacing();
51823                                unsigned first =
51824                                    ExtractDRegister(instr, 22, 12);
51825                                unsigned length = 4;
51826                                unsigned last =
51827                                    first +
51828                                    (length - 1) * (spacing == kSingle ? 1 : 2);
51829                                unsigned rn = (instr >> 16) & 0xf;
51830                                // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51831                                vst4(al,
51832                                     dt,
51833                                     NeonRegisterList(DRegister(first),
51834                                                      DRegister(last),
51835                                                      spacing,
51836                                                      lane),
51837                                     AlignedMemOperand(Register(rn),
51838                                                       align,
51839                                                       Offset));
51840                                break;
51841                              }
51842                            }
51843                            break;
51844                          }
51845                          default: {
51846                            if (((instr & 0xc00) == 0xc00) ||
51847                                ((instr & 0xd) == 0xd)) {
51848                              UnallocatedA32(instr);
51849                              return;
51850                            }
51851                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51852                            if (dt.Is(kDataTypeValueInvalid)) {
51853                              UnallocatedA32(instr);
51854                              return;
51855                            }
51856                            DecodeNeonAndAlign decode_neon =
51857                                Align_index_align_3_Decode((instr >> 4) & 0xf,
51858                                                           dt);
51859                            if (!decode_neon.IsValid()) {
51860                              UnallocatedA32(instr);
51861                              return;
51862                            }
51863                            Alignment align = decode_neon.GetAlign();
51864                            int lane = decode_neon.GetLane();
51865                            SpacingType spacing = decode_neon.GetSpacing();
51866                            unsigned first = ExtractDRegister(instr, 22, 12);
51867                            unsigned length = 4;
51868                            unsigned last =
51869                                first +
51870                                (length - 1) * (spacing == kSingle ? 1 : 2);
51871                            unsigned rn = (instr >> 16) & 0xf;
51872                            unsigned rm = instr & 0xf;
51873                            // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51874                            vst4(al,
51875                                 dt,
51876                                 NeonRegisterList(DRegister(first),
51877                                                  DRegister(last),
51878                                                  spacing,
51879                                                  lane),
51880                                 AlignedMemOperand(Register(rn),
51881                                                   align,
51882                                                   Register(rm),
51883                                                   PostIndex));
51884                            break;
51885                          }
51886                        }
51887                        break;
51888                      }
51889                    }
51890                    break;
51891                  }
51892                }
51893                break;
51894              }
51895            }
51896            break;
51897          }
51898          case 0x00100000: {
51899            // 0xf4100000
51900            switch (instr & 0x00400000) {
51901              case 0x00400000: {
51902                // 0xf4500000
51903                switch (instr & 0x000f0000) {
51904                  case 0x000f0000: {
51905                    // 0xf45f0000
51906                    uint32_t U = (instr >> 23) & 0x1;
51907                    int32_t imm = instr & 0xfff;
51908                    if (U == 0) imm = -imm;
51909                    bool minus_zero = (imm == 0) && (U == 0);
51910                    Location location(imm, kA32PcDelta);
51911                    // PLI{<c>}{<q>} <label> ; A1
51912                    if (minus_zero) {
51913                      pli(al, MemOperand(pc, minus, 0));
51914                    } else {
51915                      pli(al, &location);
51916                    }
51917                    if (((instr & 0xff7ff000) != 0xf45ff000)) {
51918                      UnpredictableA32(instr);
51919                    }
51920                    break;
51921                  }
51922                  default: {
51923                    if (((instr & 0xf0000) == 0xf0000)) {
51924                      UnallocatedA32(instr);
51925                      return;
51926                    }
51927                    unsigned rn = (instr >> 16) & 0xf;
51928                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
51929                    int32_t offset = instr & 0xfff;
51930                    // PLI{<c>}{<q>} [<Rn>{, #{+/-}<imm_3>}] ; A1
51931                    pli(al, MemOperand(Register(rn), sign, offset, Offset));
51932                    if (((instr & 0xff70f000) != 0xf450f000)) {
51933                      UnpredictableA32(instr);
51934                    }
51935                    break;
51936                  }
51937                }
51938                break;
51939              }
51940              default:
51941                UnallocatedA32(instr);
51942                break;
51943            }
51944            break;
51945          }
51946          case 0x00200000: {
51947            // 0xf4200000
51948            switch (instr & 0x00800000) {
51949              case 0x00000000: {
51950                // 0xf4200000
51951                switch (instr & 0x0000000d) {
51952                  case 0x0000000d: {
51953                    // 0xf420000d
51954                    switch (instr & 0x00000002) {
51955                      case 0x00000000: {
51956                        // 0xf420000d
51957                        switch (instr & 0x00000f00) {
51958                          case 0x00000000: {
51959                            // 0xf420000d
51960                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51961                            if (dt.Is(kDataTypeValueInvalid)) {
51962                              UnallocatedA32(instr);
51963                              return;
51964                            }
51965                            Alignment align =
51966                                Align_align_4_Decode((instr >> 4) & 0x3);
51967                            if (dt.Is(kDataTypeValueInvalid) ||
51968                                align.Is(kBadAlignment)) {
51969                              UnallocatedA32(instr);
51970                              return;
51971                            }
51972                            unsigned first = ExtractDRegister(instr, 22, 12);
51973                            unsigned length;
51974                            SpacingType spacing;
51975                            switch ((instr >> 8) & 0xf) {
51976                              default:
51977                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
51978                              case 0x0:
51979                                length = 4;
51980                                spacing = kSingle;
51981                                break;
51982                              case 0x1:
51983                                length = 4;
51984                                spacing = kDouble;
51985                                break;
51986                            }
51987                            unsigned last =
51988                                first +
51989                                (length - 1) * (spacing == kSingle ? 1 : 2);
51990                            TransferType transfer = kMultipleLanes;
51991                            unsigned rn = (instr >> 16) & 0xf;
51992                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51993                            vld4(al,
51994                                 dt,
51995                                 NeonRegisterList(DRegister(first),
51996                                                  DRegister(last),
51997                                                  spacing,
51998                                                  transfer),
51999                                 AlignedMemOperand(Register(rn),
52000                                                   align,
52001                                                   PostIndex));
52002                            break;
52003                          }
52004                          case 0x00000100: {
52005                            // 0xf420010d
52006                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52007                            if (dt.Is(kDataTypeValueInvalid)) {
52008                              UnallocatedA32(instr);
52009                              return;
52010                            }
52011                            Alignment align =
52012                                Align_align_4_Decode((instr >> 4) & 0x3);
52013                            if (dt.Is(kDataTypeValueInvalid) ||
52014                                align.Is(kBadAlignment)) {
52015                              UnallocatedA32(instr);
52016                              return;
52017                            }
52018                            unsigned first = ExtractDRegister(instr, 22, 12);
52019                            unsigned length;
52020                            SpacingType spacing;
52021                            switch ((instr >> 8) & 0xf) {
52022                              default:
52023                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52024                              case 0x0:
52025                                length = 4;
52026                                spacing = kSingle;
52027                                break;
52028                              case 0x1:
52029                                length = 4;
52030                                spacing = kDouble;
52031                                break;
52032                            }
52033                            unsigned last =
52034                                first +
52035                                (length - 1) * (spacing == kSingle ? 1 : 2);
52036                            TransferType transfer = kMultipleLanes;
52037                            unsigned rn = (instr >> 16) & 0xf;
52038                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52039                            vld4(al,
52040                                 dt,
52041                                 NeonRegisterList(DRegister(first),
52042                                                  DRegister(last),
52043                                                  spacing,
52044                                                  transfer),
52045                                 AlignedMemOperand(Register(rn),
52046                                                   align,
52047                                                   PostIndex));
52048                            break;
52049                          }
52050                          case 0x00000200: {
52051                            // 0xf420020d
52052                            if (((instr & 0xe20) == 0x620) ||
52053                                ((instr & 0xf30) == 0xa30)) {
52054                              UnallocatedA32(instr);
52055                              return;
52056                            }
52057                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52058                            if (dt.Is(kDataTypeValueInvalid)) {
52059                              UnallocatedA32(instr);
52060                              return;
52061                            }
52062                            Alignment align =
52063                                Align_align_1_Decode((instr >> 4) & 0x3);
52064                            if (dt.Is(kDataTypeValueInvalid) ||
52065                                align.Is(kBadAlignment)) {
52066                              UnallocatedA32(instr);
52067                              return;
52068                            }
52069                            unsigned first = ExtractDRegister(instr, 22, 12);
52070                            unsigned length;
52071                            SpacingType spacing = kSingle;
52072                            switch ((instr >> 8) & 0xf) {
52073                              default:
52074                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52075                              case 0x7:
52076                                length = 1;
52077                                break;
52078                              case 0xa:
52079                                length = 2;
52080                                break;
52081                              case 0x6:
52082                                length = 3;
52083                                break;
52084                              case 0x2:
52085                                length = 4;
52086                                break;
52087                            }
52088                            unsigned last = first + length - 1;
52089                            TransferType transfer = kMultipleLanes;
52090                            unsigned rn = (instr >> 16) & 0xf;
52091                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52092                            vld1(al,
52093                                 dt,
52094                                 NeonRegisterList(DRegister(first),
52095                                                  DRegister(last),
52096                                                  spacing,
52097                                                  transfer),
52098                                 AlignedMemOperand(Register(rn),
52099                                                   align,
52100                                                   PostIndex));
52101                            break;
52102                          }
52103                          case 0x00000300: {
52104                            // 0xf420030d
52105                            if (((instr & 0xe30) == 0x830)) {
52106                              UnallocatedA32(instr);
52107                              return;
52108                            }
52109                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52110                            if (dt.Is(kDataTypeValueInvalid)) {
52111                              UnallocatedA32(instr);
52112                              return;
52113                            }
52114                            Alignment align =
52115                                Align_align_2_Decode((instr >> 4) & 0x3);
52116                            if (dt.Is(kDataTypeValueInvalid) ||
52117                                align.Is(kBadAlignment)) {
52118                              UnallocatedA32(instr);
52119                              return;
52120                            }
52121                            unsigned first = ExtractDRegister(instr, 22, 12);
52122                            unsigned length;
52123                            SpacingType spacing;
52124                            switch ((instr >> 8) & 0xf) {
52125                              default:
52126                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52127                              case 0x8:
52128                                length = 2;
52129                                spacing = kSingle;
52130                                break;
52131                              case 0x9:
52132                                length = 2;
52133                                spacing = kDouble;
52134                                break;
52135                              case 0x3:
52136                                length = 4;
52137                                spacing = kSingle;
52138                                break;
52139                            }
52140                            unsigned last =
52141                                first +
52142                                (length - 1) * (spacing == kSingle ? 1 : 2);
52143                            TransferType transfer = kMultipleLanes;
52144                            unsigned rn = (instr >> 16) & 0xf;
52145                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52146                            vld2(al,
52147                                 dt,
52148                                 NeonRegisterList(DRegister(first),
52149                                                  DRegister(last),
52150                                                  spacing,
52151                                                  transfer),
52152                                 AlignedMemOperand(Register(rn),
52153                                                   align,
52154                                                   PostIndex));
52155                            break;
52156                          }
52157                          case 0x00000400: {
52158                            // 0xf420040d
52159                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52160                            if (dt.Is(kDataTypeValueInvalid)) {
52161                              UnallocatedA32(instr);
52162                              return;
52163                            }
52164                            Alignment align =
52165                                Align_align_3_Decode((instr >> 4) & 0x3);
52166                            if (dt.Is(kDataTypeValueInvalid) ||
52167                                align.Is(kBadAlignment)) {
52168                              UnallocatedA32(instr);
52169                              return;
52170                            }
52171                            unsigned first = ExtractDRegister(instr, 22, 12);
52172                            unsigned length;
52173                            SpacingType spacing;
52174                            switch ((instr >> 8) & 0xf) {
52175                              default:
52176                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52177                              case 0x4:
52178                                length = 3;
52179                                spacing = kSingle;
52180                                break;
52181                              case 0x5:
52182                                length = 3;
52183                                spacing = kDouble;
52184                                break;
52185                            }
52186                            unsigned last =
52187                                first +
52188                                (length - 1) * (spacing == kSingle ? 1 : 2);
52189                            TransferType transfer = kMultipleLanes;
52190                            unsigned rn = (instr >> 16) & 0xf;
52191                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52192                            vld3(al,
52193                                 dt,
52194                                 NeonRegisterList(DRegister(first),
52195                                                  DRegister(last),
52196                                                  spacing,
52197                                                  transfer),
52198                                 AlignedMemOperand(Register(rn),
52199                                                   align,
52200                                                   PostIndex));
52201                            break;
52202                          }
52203                          case 0x00000500: {
52204                            // 0xf420050d
52205                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52206                            if (dt.Is(kDataTypeValueInvalid)) {
52207                              UnallocatedA32(instr);
52208                              return;
52209                            }
52210                            Alignment align =
52211                                Align_align_3_Decode((instr >> 4) & 0x3);
52212                            if (dt.Is(kDataTypeValueInvalid) ||
52213                                align.Is(kBadAlignment)) {
52214                              UnallocatedA32(instr);
52215                              return;
52216                            }
52217                            unsigned first = ExtractDRegister(instr, 22, 12);
52218                            unsigned length;
52219                            SpacingType spacing;
52220                            switch ((instr >> 8) & 0xf) {
52221                              default:
52222                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52223                              case 0x4:
52224                                length = 3;
52225                                spacing = kSingle;
52226                                break;
52227                              case 0x5:
52228                                length = 3;
52229                                spacing = kDouble;
52230                                break;
52231                            }
52232                            unsigned last =
52233                                first +
52234                                (length - 1) * (spacing == kSingle ? 1 : 2);
52235                            TransferType transfer = kMultipleLanes;
52236                            unsigned rn = (instr >> 16) & 0xf;
52237                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52238                            vld3(al,
52239                                 dt,
52240                                 NeonRegisterList(DRegister(first),
52241                                                  DRegister(last),
52242                                                  spacing,
52243                                                  transfer),
52244                                 AlignedMemOperand(Register(rn),
52245                                                   align,
52246                                                   PostIndex));
52247                            break;
52248                          }
52249                          case 0x00000600: {
52250                            // 0xf420060d
52251                            if (((instr & 0xe20) == 0x620) ||
52252                                ((instr & 0xf30) == 0xa30)) {
52253                              UnallocatedA32(instr);
52254                              return;
52255                            }
52256                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52257                            if (dt.Is(kDataTypeValueInvalid)) {
52258                              UnallocatedA32(instr);
52259                              return;
52260                            }
52261                            Alignment align =
52262                                Align_align_1_Decode((instr >> 4) & 0x3);
52263                            if (dt.Is(kDataTypeValueInvalid) ||
52264                                align.Is(kBadAlignment)) {
52265                              UnallocatedA32(instr);
52266                              return;
52267                            }
52268                            unsigned first = ExtractDRegister(instr, 22, 12);
52269                            unsigned length;
52270                            SpacingType spacing = kSingle;
52271                            switch ((instr >> 8) & 0xf) {
52272                              default:
52273                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52274                              case 0x7:
52275                                length = 1;
52276                                break;
52277                              case 0xa:
52278                                length = 2;
52279                                break;
52280                              case 0x6:
52281                                length = 3;
52282                                break;
52283                              case 0x2:
52284                                length = 4;
52285                                break;
52286                            }
52287                            unsigned last = first + length - 1;
52288                            TransferType transfer = kMultipleLanes;
52289                            unsigned rn = (instr >> 16) & 0xf;
52290                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52291                            vld1(al,
52292                                 dt,
52293                                 NeonRegisterList(DRegister(first),
52294                                                  DRegister(last),
52295                                                  spacing,
52296                                                  transfer),
52297                                 AlignedMemOperand(Register(rn),
52298                                                   align,
52299                                                   PostIndex));
52300                            break;
52301                          }
52302                          case 0x00000700: {
52303                            // 0xf420070d
52304                            if (((instr & 0xe20) == 0x620) ||
52305                                ((instr & 0xf30) == 0xa30)) {
52306                              UnallocatedA32(instr);
52307                              return;
52308                            }
52309                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52310                            if (dt.Is(kDataTypeValueInvalid)) {
52311                              UnallocatedA32(instr);
52312                              return;
52313                            }
52314                            Alignment align =
52315                                Align_align_1_Decode((instr >> 4) & 0x3);
52316                            if (dt.Is(kDataTypeValueInvalid) ||
52317                                align.Is(kBadAlignment)) {
52318                              UnallocatedA32(instr);
52319                              return;
52320                            }
52321                            unsigned first = ExtractDRegister(instr, 22, 12);
52322                            unsigned length;
52323                            SpacingType spacing = kSingle;
52324                            switch ((instr >> 8) & 0xf) {
52325                              default:
52326                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52327                              case 0x7:
52328                                length = 1;
52329                                break;
52330                              case 0xa:
52331                                length = 2;
52332                                break;
52333                              case 0x6:
52334                                length = 3;
52335                                break;
52336                              case 0x2:
52337                                length = 4;
52338                                break;
52339                            }
52340                            unsigned last = first + length - 1;
52341                            TransferType transfer = kMultipleLanes;
52342                            unsigned rn = (instr >> 16) & 0xf;
52343                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52344                            vld1(al,
52345                                 dt,
52346                                 NeonRegisterList(DRegister(first),
52347                                                  DRegister(last),
52348                                                  spacing,
52349                                                  transfer),
52350                                 AlignedMemOperand(Register(rn),
52351                                                   align,
52352                                                   PostIndex));
52353                            break;
52354                          }
52355                          case 0x00000800: {
52356                            // 0xf420080d
52357                            if (((instr & 0xe30) == 0x830)) {
52358                              UnallocatedA32(instr);
52359                              return;
52360                            }
52361                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52362                            if (dt.Is(kDataTypeValueInvalid)) {
52363                              UnallocatedA32(instr);
52364                              return;
52365                            }
52366                            Alignment align =
52367                                Align_align_2_Decode((instr >> 4) & 0x3);
52368                            if (dt.Is(kDataTypeValueInvalid) ||
52369                                align.Is(kBadAlignment)) {
52370                              UnallocatedA32(instr);
52371                              return;
52372                            }
52373                            unsigned first = ExtractDRegister(instr, 22, 12);
52374                            unsigned length;
52375                            SpacingType spacing;
52376                            switch ((instr >> 8) & 0xf) {
52377                              default:
52378                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52379                              case 0x8:
52380                                length = 2;
52381                                spacing = kSingle;
52382                                break;
52383                              case 0x9:
52384                                length = 2;
52385                                spacing = kDouble;
52386                                break;
52387                              case 0x3:
52388                                length = 4;
52389                                spacing = kSingle;
52390                                break;
52391                            }
52392                            unsigned last =
52393                                first +
52394                                (length - 1) * (spacing == kSingle ? 1 : 2);
52395                            TransferType transfer = kMultipleLanes;
52396                            unsigned rn = (instr >> 16) & 0xf;
52397                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52398                            vld2(al,
52399                                 dt,
52400                                 NeonRegisterList(DRegister(first),
52401                                                  DRegister(last),
52402                                                  spacing,
52403                                                  transfer),
52404                                 AlignedMemOperand(Register(rn),
52405                                                   align,
52406                                                   PostIndex));
52407                            break;
52408                          }
52409                          case 0x00000900: {
52410                            // 0xf420090d
52411                            if (((instr & 0xe30) == 0x830)) {
52412                              UnallocatedA32(instr);
52413                              return;
52414                            }
52415                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52416                            if (dt.Is(kDataTypeValueInvalid)) {
52417                              UnallocatedA32(instr);
52418                              return;
52419                            }
52420                            Alignment align =
52421                                Align_align_2_Decode((instr >> 4) & 0x3);
52422                            if (dt.Is(kDataTypeValueInvalid) ||
52423                                align.Is(kBadAlignment)) {
52424                              UnallocatedA32(instr);
52425                              return;
52426                            }
52427                            unsigned first = ExtractDRegister(instr, 22, 12);
52428                            unsigned length;
52429                            SpacingType spacing;
52430                            switch ((instr >> 8) & 0xf) {
52431                              default:
52432                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52433                              case 0x8:
52434                                length = 2;
52435                                spacing = kSingle;
52436                                break;
52437                              case 0x9:
52438                                length = 2;
52439                                spacing = kDouble;
52440                                break;
52441                              case 0x3:
52442                                length = 4;
52443                                spacing = kSingle;
52444                                break;
52445                            }
52446                            unsigned last =
52447                                first +
52448                                (length - 1) * (spacing == kSingle ? 1 : 2);
52449                            TransferType transfer = kMultipleLanes;
52450                            unsigned rn = (instr >> 16) & 0xf;
52451                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52452                            vld2(al,
52453                                 dt,
52454                                 NeonRegisterList(DRegister(first),
52455                                                  DRegister(last),
52456                                                  spacing,
52457                                                  transfer),
52458                                 AlignedMemOperand(Register(rn),
52459                                                   align,
52460                                                   PostIndex));
52461                            break;
52462                          }
52463                          case 0x00000a00: {
52464                            // 0xf4200a0d
52465                            if (((instr & 0xe20) == 0x620) ||
52466                                ((instr & 0xf30) == 0xa30)) {
52467                              UnallocatedA32(instr);
52468                              return;
52469                            }
52470                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52471                            if (dt.Is(kDataTypeValueInvalid)) {
52472                              UnallocatedA32(instr);
52473                              return;
52474                            }
52475                            Alignment align =
52476                                Align_align_1_Decode((instr >> 4) & 0x3);
52477                            if (dt.Is(kDataTypeValueInvalid) ||
52478                                align.Is(kBadAlignment)) {
52479                              UnallocatedA32(instr);
52480                              return;
52481                            }
52482                            unsigned first = ExtractDRegister(instr, 22, 12);
52483                            unsigned length;
52484                            SpacingType spacing = kSingle;
52485                            switch ((instr >> 8) & 0xf) {
52486                              default:
52487                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52488                              case 0x7:
52489                                length = 1;
52490                                break;
52491                              case 0xa:
52492                                length = 2;
52493                                break;
52494                              case 0x6:
52495                                length = 3;
52496                                break;
52497                              case 0x2:
52498                                length = 4;
52499                                break;
52500                            }
52501                            unsigned last = first + length - 1;
52502                            TransferType transfer = kMultipleLanes;
52503                            unsigned rn = (instr >> 16) & 0xf;
52504                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52505                            vld1(al,
52506                                 dt,
52507                                 NeonRegisterList(DRegister(first),
52508                                                  DRegister(last),
52509                                                  spacing,
52510                                                  transfer),
52511                                 AlignedMemOperand(Register(rn),
52512                                                   align,
52513                                                   PostIndex));
52514                            break;
52515                          }
52516                          default:
52517                            UnallocatedA32(instr);
52518                            break;
52519                        }
52520                        break;
52521                      }
52522                      case 0x00000002: {
52523                        // 0xf420000f
52524                        switch (instr & 0x00000f00) {
52525                          case 0x00000000: {
52526                            // 0xf420000d
52527                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52528                            if (dt.Is(kDataTypeValueInvalid)) {
52529                              UnallocatedA32(instr);
52530                              return;
52531                            }
52532                            Alignment align =
52533                                Align_align_4_Decode((instr >> 4) & 0x3);
52534                            if (dt.Is(kDataTypeValueInvalid) ||
52535                                align.Is(kBadAlignment)) {
52536                              UnallocatedA32(instr);
52537                              return;
52538                            }
52539                            unsigned first = ExtractDRegister(instr, 22, 12);
52540                            unsigned length;
52541                            SpacingType spacing;
52542                            switch ((instr >> 8) & 0xf) {
52543                              default:
52544                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52545                              case 0x0:
52546                                length = 4;
52547                                spacing = kSingle;
52548                                break;
52549                              case 0x1:
52550                                length = 4;
52551                                spacing = kDouble;
52552                                break;
52553                            }
52554                            unsigned last =
52555                                first +
52556                                (length - 1) * (spacing == kSingle ? 1 : 2);
52557                            TransferType transfer = kMultipleLanes;
52558                            unsigned rn = (instr >> 16) & 0xf;
52559                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52560                            vld4(al,
52561                                 dt,
52562                                 NeonRegisterList(DRegister(first),
52563                                                  DRegister(last),
52564                                                  spacing,
52565                                                  transfer),
52566                                 AlignedMemOperand(Register(rn),
52567                                                   align,
52568                                                   Offset));
52569                            break;
52570                          }
52571                          case 0x00000100: {
52572                            // 0xf420010d
52573                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52574                            if (dt.Is(kDataTypeValueInvalid)) {
52575                              UnallocatedA32(instr);
52576                              return;
52577                            }
52578                            Alignment align =
52579                                Align_align_4_Decode((instr >> 4) & 0x3);
52580                            if (dt.Is(kDataTypeValueInvalid) ||
52581                                align.Is(kBadAlignment)) {
52582                              UnallocatedA32(instr);
52583                              return;
52584                            }
52585                            unsigned first = ExtractDRegister(instr, 22, 12);
52586                            unsigned length;
52587                            SpacingType spacing;
52588                            switch ((instr >> 8) & 0xf) {
52589                              default:
52590                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52591                              case 0x0:
52592                                length = 4;
52593                                spacing = kSingle;
52594                                break;
52595                              case 0x1:
52596                                length = 4;
52597                                spacing = kDouble;
52598                                break;
52599                            }
52600                            unsigned last =
52601                                first +
52602                                (length - 1) * (spacing == kSingle ? 1 : 2);
52603                            TransferType transfer = kMultipleLanes;
52604                            unsigned rn = (instr >> 16) & 0xf;
52605                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52606                            vld4(al,
52607                                 dt,
52608                                 NeonRegisterList(DRegister(first),
52609                                                  DRegister(last),
52610                                                  spacing,
52611                                                  transfer),
52612                                 AlignedMemOperand(Register(rn),
52613                                                   align,
52614                                                   Offset));
52615                            break;
52616                          }
52617                          case 0x00000200: {
52618                            // 0xf420020d
52619                            if (((instr & 0xe20) == 0x620) ||
52620                                ((instr & 0xf30) == 0xa30)) {
52621                              UnallocatedA32(instr);
52622                              return;
52623                            }
52624                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52625                            if (dt.Is(kDataTypeValueInvalid)) {
52626                              UnallocatedA32(instr);
52627                              return;
52628                            }
52629                            Alignment align =
52630                                Align_align_1_Decode((instr >> 4) & 0x3);
52631                            if (dt.Is(kDataTypeValueInvalid) ||
52632                                align.Is(kBadAlignment)) {
52633                              UnallocatedA32(instr);
52634                              return;
52635                            }
52636                            unsigned first = ExtractDRegister(instr, 22, 12);
52637                            unsigned length;
52638                            SpacingType spacing = kSingle;
52639                            switch ((instr >> 8) & 0xf) {
52640                              default:
52641                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52642                              case 0x7:
52643                                length = 1;
52644                                break;
52645                              case 0xa:
52646                                length = 2;
52647                                break;
52648                              case 0x6:
52649                                length = 3;
52650                                break;
52651                              case 0x2:
52652                                length = 4;
52653                                break;
52654                            }
52655                            unsigned last = first + length - 1;
52656                            TransferType transfer = kMultipleLanes;
52657                            unsigned rn = (instr >> 16) & 0xf;
52658                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52659                            vld1(al,
52660                                 dt,
52661                                 NeonRegisterList(DRegister(first),
52662                                                  DRegister(last),
52663                                                  spacing,
52664                                                  transfer),
52665                                 AlignedMemOperand(Register(rn),
52666                                                   align,
52667                                                   Offset));
52668                            break;
52669                          }
52670                          case 0x00000300: {
52671                            // 0xf420030d
52672                            if (((instr & 0xe30) == 0x830)) {
52673                              UnallocatedA32(instr);
52674                              return;
52675                            }
52676                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52677                            if (dt.Is(kDataTypeValueInvalid)) {
52678                              UnallocatedA32(instr);
52679                              return;
52680                            }
52681                            Alignment align =
52682                                Align_align_2_Decode((instr >> 4) & 0x3);
52683                            if (dt.Is(kDataTypeValueInvalid) ||
52684                                align.Is(kBadAlignment)) {
52685                              UnallocatedA32(instr);
52686                              return;
52687                            }
52688                            unsigned first = ExtractDRegister(instr, 22, 12);
52689                            unsigned length;
52690                            SpacingType spacing;
52691                            switch ((instr >> 8) & 0xf) {
52692                              default:
52693                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52694                              case 0x8:
52695                                length = 2;
52696                                spacing = kSingle;
52697                                break;
52698                              case 0x9:
52699                                length = 2;
52700                                spacing = kDouble;
52701                                break;
52702                              case 0x3:
52703                                length = 4;
52704                                spacing = kSingle;
52705                                break;
52706                            }
52707                            unsigned last =
52708                                first +
52709                                (length - 1) * (spacing == kSingle ? 1 : 2);
52710                            TransferType transfer = kMultipleLanes;
52711                            unsigned rn = (instr >> 16) & 0xf;
52712                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52713                            vld2(al,
52714                                 dt,
52715                                 NeonRegisterList(DRegister(first),
52716                                                  DRegister(last),
52717                                                  spacing,
52718                                                  transfer),
52719                                 AlignedMemOperand(Register(rn),
52720                                                   align,
52721                                                   Offset));
52722                            break;
52723                          }
52724                          case 0x00000400: {
52725                            // 0xf420040d
52726                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52727                            if (dt.Is(kDataTypeValueInvalid)) {
52728                              UnallocatedA32(instr);
52729                              return;
52730                            }
52731                            Alignment align =
52732                                Align_align_3_Decode((instr >> 4) & 0x3);
52733                            if (dt.Is(kDataTypeValueInvalid) ||
52734                                align.Is(kBadAlignment)) {
52735                              UnallocatedA32(instr);
52736                              return;
52737                            }
52738                            unsigned first = ExtractDRegister(instr, 22, 12);
52739                            unsigned length;
52740                            SpacingType spacing;
52741                            switch ((instr >> 8) & 0xf) {
52742                              default:
52743                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52744                              case 0x4:
52745                                length = 3;
52746                                spacing = kSingle;
52747                                break;
52748                              case 0x5:
52749                                length = 3;
52750                                spacing = kDouble;
52751                                break;
52752                            }
52753                            unsigned last =
52754                                first +
52755                                (length - 1) * (spacing == kSingle ? 1 : 2);
52756                            TransferType transfer = kMultipleLanes;
52757                            unsigned rn = (instr >> 16) & 0xf;
52758                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52759                            vld3(al,
52760                                 dt,
52761                                 NeonRegisterList(DRegister(first),
52762                                                  DRegister(last),
52763                                                  spacing,
52764                                                  transfer),
52765                                 AlignedMemOperand(Register(rn),
52766                                                   align,
52767                                                   Offset));
52768                            break;
52769                          }
52770                          case 0x00000500: {
52771                            // 0xf420050d
52772                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52773                            if (dt.Is(kDataTypeValueInvalid)) {
52774                              UnallocatedA32(instr);
52775                              return;
52776                            }
52777                            Alignment align =
52778                                Align_align_3_Decode((instr >> 4) & 0x3);
52779                            if (dt.Is(kDataTypeValueInvalid) ||
52780                                align.Is(kBadAlignment)) {
52781                              UnallocatedA32(instr);
52782                              return;
52783                            }
52784                            unsigned first = ExtractDRegister(instr, 22, 12);
52785                            unsigned length;
52786                            SpacingType spacing;
52787                            switch ((instr >> 8) & 0xf) {
52788                              default:
52789                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52790                              case 0x4:
52791                                length = 3;
52792                                spacing = kSingle;
52793                                break;
52794                              case 0x5:
52795                                length = 3;
52796                                spacing = kDouble;
52797                                break;
52798                            }
52799                            unsigned last =
52800                                first +
52801                                (length - 1) * (spacing == kSingle ? 1 : 2);
52802                            TransferType transfer = kMultipleLanes;
52803                            unsigned rn = (instr >> 16) & 0xf;
52804                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52805                            vld3(al,
52806                                 dt,
52807                                 NeonRegisterList(DRegister(first),
52808                                                  DRegister(last),
52809                                                  spacing,
52810                                                  transfer),
52811                                 AlignedMemOperand(Register(rn),
52812                                                   align,
52813                                                   Offset));
52814                            break;
52815                          }
52816                          case 0x00000600: {
52817                            // 0xf420060d
52818                            if (((instr & 0xe20) == 0x620) ||
52819                                ((instr & 0xf30) == 0xa30)) {
52820                              UnallocatedA32(instr);
52821                              return;
52822                            }
52823                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52824                            if (dt.Is(kDataTypeValueInvalid)) {
52825                              UnallocatedA32(instr);
52826                              return;
52827                            }
52828                            Alignment align =
52829                                Align_align_1_Decode((instr >> 4) & 0x3);
52830                            if (dt.Is(kDataTypeValueInvalid) ||
52831                                align.Is(kBadAlignment)) {
52832                              UnallocatedA32(instr);
52833                              return;
52834                            }
52835                            unsigned first = ExtractDRegister(instr, 22, 12);
52836                            unsigned length;
52837                            SpacingType spacing = kSingle;
52838                            switch ((instr >> 8) & 0xf) {
52839                              default:
52840                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52841                              case 0x7:
52842                                length = 1;
52843                                break;
52844                              case 0xa:
52845                                length = 2;
52846                                break;
52847                              case 0x6:
52848                                length = 3;
52849                                break;
52850                              case 0x2:
52851                                length = 4;
52852                                break;
52853                            }
52854                            unsigned last = first + length - 1;
52855                            TransferType transfer = kMultipleLanes;
52856                            unsigned rn = (instr >> 16) & 0xf;
52857                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52858                            vld1(al,
52859                                 dt,
52860                                 NeonRegisterList(DRegister(first),
52861                                                  DRegister(last),
52862                                                  spacing,
52863                                                  transfer),
52864                                 AlignedMemOperand(Register(rn),
52865                                                   align,
52866                                                   Offset));
52867                            break;
52868                          }
52869                          case 0x00000700: {
52870                            // 0xf420070d
52871                            if (((instr & 0xe20) == 0x620) ||
52872                                ((instr & 0xf30) == 0xa30)) {
52873                              UnallocatedA32(instr);
52874                              return;
52875                            }
52876                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52877                            if (dt.Is(kDataTypeValueInvalid)) {
52878                              UnallocatedA32(instr);
52879                              return;
52880                            }
52881                            Alignment align =
52882                                Align_align_1_Decode((instr >> 4) & 0x3);
52883                            if (dt.Is(kDataTypeValueInvalid) ||
52884                                align.Is(kBadAlignment)) {
52885                              UnallocatedA32(instr);
52886                              return;
52887                            }
52888                            unsigned first = ExtractDRegister(instr, 22, 12);
52889                            unsigned length;
52890                            SpacingType spacing = kSingle;
52891                            switch ((instr >> 8) & 0xf) {
52892                              default:
52893                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52894                              case 0x7:
52895                                length = 1;
52896                                break;
52897                              case 0xa:
52898                                length = 2;
52899                                break;
52900                              case 0x6:
52901                                length = 3;
52902                                break;
52903                              case 0x2:
52904                                length = 4;
52905                                break;
52906                            }
52907                            unsigned last = first + length - 1;
52908                            TransferType transfer = kMultipleLanes;
52909                            unsigned rn = (instr >> 16) & 0xf;
52910                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52911                            vld1(al,
52912                                 dt,
52913                                 NeonRegisterList(DRegister(first),
52914                                                  DRegister(last),
52915                                                  spacing,
52916                                                  transfer),
52917                                 AlignedMemOperand(Register(rn),
52918                                                   align,
52919                                                   Offset));
52920                            break;
52921                          }
52922                          case 0x00000800: {
52923                            // 0xf420080d
52924                            if (((instr & 0xe30) == 0x830)) {
52925                              UnallocatedA32(instr);
52926                              return;
52927                            }
52928                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52929                            if (dt.Is(kDataTypeValueInvalid)) {
52930                              UnallocatedA32(instr);
52931                              return;
52932                            }
52933                            Alignment align =
52934                                Align_align_2_Decode((instr >> 4) & 0x3);
52935                            if (dt.Is(kDataTypeValueInvalid) ||
52936                                align.Is(kBadAlignment)) {
52937                              UnallocatedA32(instr);
52938                              return;
52939                            }
52940                            unsigned first = ExtractDRegister(instr, 22, 12);
52941                            unsigned length;
52942                            SpacingType spacing;
52943                            switch ((instr >> 8) & 0xf) {
52944                              default:
52945                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
52946                              case 0x8:
52947                                length = 2;
52948                                spacing = kSingle;
52949                                break;
52950                              case 0x9:
52951                                length = 2;
52952                                spacing = kDouble;
52953                                break;
52954                              case 0x3:
52955                                length = 4;
52956                                spacing = kSingle;
52957                                break;
52958                            }
52959                            unsigned last =
52960                                first +
52961                                (length - 1) * (spacing == kSingle ? 1 : 2);
52962                            TransferType transfer = kMultipleLanes;
52963                            unsigned rn = (instr >> 16) & 0xf;
52964                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52965                            vld2(al,
52966                                 dt,
52967                                 NeonRegisterList(DRegister(first),
52968                                                  DRegister(last),
52969                                                  spacing,
52970                                                  transfer),
52971                                 AlignedMemOperand(Register(rn),
52972                                                   align,
52973                                                   Offset));
52974                            break;
52975                          }
52976                          case 0x00000900: {
52977                            // 0xf420090d
52978                            if (((instr & 0xe30) == 0x830)) {
52979                              UnallocatedA32(instr);
52980                              return;
52981                            }
52982                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52983                            if (dt.Is(kDataTypeValueInvalid)) {
52984                              UnallocatedA32(instr);
52985                              return;
52986                            }
52987                            Alignment align =
52988                                Align_align_2_Decode((instr >> 4) & 0x3);
52989                            if (dt.Is(kDataTypeValueInvalid) ||
52990                                align.Is(kBadAlignment)) {
52991                              UnallocatedA32(instr);
52992                              return;
52993                            }
52994                            unsigned first = ExtractDRegister(instr, 22, 12);
52995                            unsigned length;
52996                            SpacingType spacing;
52997                            switch ((instr >> 8) & 0xf) {
52998                              default:
52999                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53000                              case 0x8:
53001                                length = 2;
53002                                spacing = kSingle;
53003                                break;
53004                              case 0x9:
53005                                length = 2;
53006                                spacing = kDouble;
53007                                break;
53008                              case 0x3:
53009                                length = 4;
53010                                spacing = kSingle;
53011                                break;
53012                            }
53013                            unsigned last =
53014                                first +
53015                                (length - 1) * (spacing == kSingle ? 1 : 2);
53016                            TransferType transfer = kMultipleLanes;
53017                            unsigned rn = (instr >> 16) & 0xf;
53018                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53019                            vld2(al,
53020                                 dt,
53021                                 NeonRegisterList(DRegister(first),
53022                                                  DRegister(last),
53023                                                  spacing,
53024                                                  transfer),
53025                                 AlignedMemOperand(Register(rn),
53026                                                   align,
53027                                                   Offset));
53028                            break;
53029                          }
53030                          case 0x00000a00: {
53031                            // 0xf4200a0d
53032                            if (((instr & 0xe20) == 0x620) ||
53033                                ((instr & 0xf30) == 0xa30)) {
53034                              UnallocatedA32(instr);
53035                              return;
53036                            }
53037                            DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53038                            if (dt.Is(kDataTypeValueInvalid)) {
53039                              UnallocatedA32(instr);
53040                              return;
53041                            }
53042                            Alignment align =
53043                                Align_align_1_Decode((instr >> 4) & 0x3);
53044                            if (dt.Is(kDataTypeValueInvalid) ||
53045                                align.Is(kBadAlignment)) {
53046                              UnallocatedA32(instr);
53047                              return;
53048                            }
53049                            unsigned first = ExtractDRegister(instr, 22, 12);
53050                            unsigned length;
53051                            SpacingType spacing = kSingle;
53052                            switch ((instr >> 8) & 0xf) {
53053                              default:
53054                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53055                              case 0x7:
53056                                length = 1;
53057                                break;
53058                              case 0xa:
53059                                length = 2;
53060                                break;
53061                              case 0x6:
53062                                length = 3;
53063                                break;
53064                              case 0x2:
53065                                length = 4;
53066                                break;
53067                            }
53068                            unsigned last = first + length - 1;
53069                            TransferType transfer = kMultipleLanes;
53070                            unsigned rn = (instr >> 16) & 0xf;
53071                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53072                            vld1(al,
53073                                 dt,
53074                                 NeonRegisterList(DRegister(first),
53075                                                  DRegister(last),
53076                                                  spacing,
53077                                                  transfer),
53078                                 AlignedMemOperand(Register(rn),
53079                                                   align,
53080                                                   Offset));
53081                            break;
53082                          }
53083                          default:
53084                            UnallocatedA32(instr);
53085                            break;
53086                        }
53087                        break;
53088                      }
53089                    }
53090                    break;
53091                  }
53092                  default: {
53093                    switch (instr & 0x00000f00) {
53094                      case 0x00000000: {
53095                        // 0xf4200000
53096                        if (((instr & 0xd) == 0xd)) {
53097                          UnallocatedA32(instr);
53098                          return;
53099                        }
53100                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53101                        if (dt.Is(kDataTypeValueInvalid)) {
53102                          UnallocatedA32(instr);
53103                          return;
53104                        }
53105                        Alignment align =
53106                            Align_align_4_Decode((instr >> 4) & 0x3);
53107                        if (dt.Is(kDataTypeValueInvalid) ||
53108                            align.Is(kBadAlignment)) {
53109                          UnallocatedA32(instr);
53110                          return;
53111                        }
53112                        unsigned first = ExtractDRegister(instr, 22, 12);
53113                        unsigned length;
53114                        SpacingType spacing;
53115                        switch ((instr >> 8) & 0xf) {
53116                          default:
53117                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53118                          case 0x0:
53119                            length = 4;
53120                            spacing = kSingle;
53121                            break;
53122                          case 0x1:
53123                            length = 4;
53124                            spacing = kDouble;
53125                            break;
53126                        }
53127                        unsigned last =
53128                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53129                        TransferType transfer = kMultipleLanes;
53130                        unsigned rn = (instr >> 16) & 0xf;
53131                        unsigned rm = instr & 0xf;
53132                        // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53133                        vld4(al,
53134                             dt,
53135                             NeonRegisterList(DRegister(first),
53136                                              DRegister(last),
53137                                              spacing,
53138                                              transfer),
53139                             AlignedMemOperand(Register(rn),
53140                                               align,
53141                                               Register(rm),
53142                                               PostIndex));
53143                        break;
53144                      }
53145                      case 0x00000100: {
53146                        // 0xf4200100
53147                        if (((instr & 0xd) == 0xd)) {
53148                          UnallocatedA32(instr);
53149                          return;
53150                        }
53151                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53152                        if (dt.Is(kDataTypeValueInvalid)) {
53153                          UnallocatedA32(instr);
53154                          return;
53155                        }
53156                        Alignment align =
53157                            Align_align_4_Decode((instr >> 4) & 0x3);
53158                        if (dt.Is(kDataTypeValueInvalid) ||
53159                            align.Is(kBadAlignment)) {
53160                          UnallocatedA32(instr);
53161                          return;
53162                        }
53163                        unsigned first = ExtractDRegister(instr, 22, 12);
53164                        unsigned length;
53165                        SpacingType spacing;
53166                        switch ((instr >> 8) & 0xf) {
53167                          default:
53168                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53169                          case 0x0:
53170                            length = 4;
53171                            spacing = kSingle;
53172                            break;
53173                          case 0x1:
53174                            length = 4;
53175                            spacing = kDouble;
53176                            break;
53177                        }
53178                        unsigned last =
53179                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53180                        TransferType transfer = kMultipleLanes;
53181                        unsigned rn = (instr >> 16) & 0xf;
53182                        unsigned rm = instr & 0xf;
53183                        // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53184                        vld4(al,
53185                             dt,
53186                             NeonRegisterList(DRegister(first),
53187                                              DRegister(last),
53188                                              spacing,
53189                                              transfer),
53190                             AlignedMemOperand(Register(rn),
53191                                               align,
53192                                               Register(rm),
53193                                               PostIndex));
53194                        break;
53195                      }
53196                      case 0x00000200: {
53197                        // 0xf4200200
53198                        if (((instr & 0xd) == 0xd) ||
53199                            ((instr & 0xe20) == 0x620) ||
53200                            ((instr & 0xf30) == 0xa30)) {
53201                          UnallocatedA32(instr);
53202                          return;
53203                        }
53204                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53205                        if (dt.Is(kDataTypeValueInvalid)) {
53206                          UnallocatedA32(instr);
53207                          return;
53208                        }
53209                        Alignment align =
53210                            Align_align_1_Decode((instr >> 4) & 0x3);
53211                        if (dt.Is(kDataTypeValueInvalid) ||
53212                            align.Is(kBadAlignment)) {
53213                          UnallocatedA32(instr);
53214                          return;
53215                        }
53216                        unsigned first = ExtractDRegister(instr, 22, 12);
53217                        unsigned length;
53218                        SpacingType spacing = kSingle;
53219                        switch ((instr >> 8) & 0xf) {
53220                          default:
53221                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53222                          case 0x7:
53223                            length = 1;
53224                            break;
53225                          case 0xa:
53226                            length = 2;
53227                            break;
53228                          case 0x6:
53229                            length = 3;
53230                            break;
53231                          case 0x2:
53232                            length = 4;
53233                            break;
53234                        }
53235                        unsigned last = first + length - 1;
53236                        TransferType transfer = kMultipleLanes;
53237                        unsigned rn = (instr >> 16) & 0xf;
53238                        unsigned rm = instr & 0xf;
53239                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53240                        vld1(al,
53241                             dt,
53242                             NeonRegisterList(DRegister(first),
53243                                              DRegister(last),
53244                                              spacing,
53245                                              transfer),
53246                             AlignedMemOperand(Register(rn),
53247                                               align,
53248                                               Register(rm),
53249                                               PostIndex));
53250                        break;
53251                      }
53252                      case 0x00000300: {
53253                        // 0xf4200300
53254                        if (((instr & 0xd) == 0xd) ||
53255                            ((instr & 0xe30) == 0x830)) {
53256                          UnallocatedA32(instr);
53257                          return;
53258                        }
53259                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53260                        if (dt.Is(kDataTypeValueInvalid)) {
53261                          UnallocatedA32(instr);
53262                          return;
53263                        }
53264                        Alignment align =
53265                            Align_align_2_Decode((instr >> 4) & 0x3);
53266                        if (dt.Is(kDataTypeValueInvalid) ||
53267                            align.Is(kBadAlignment)) {
53268                          UnallocatedA32(instr);
53269                          return;
53270                        }
53271                        unsigned first = ExtractDRegister(instr, 22, 12);
53272                        unsigned length;
53273                        SpacingType spacing;
53274                        switch ((instr >> 8) & 0xf) {
53275                          default:
53276                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53277                          case 0x8:
53278                            length = 2;
53279                            spacing = kSingle;
53280                            break;
53281                          case 0x9:
53282                            length = 2;
53283                            spacing = kDouble;
53284                            break;
53285                          case 0x3:
53286                            length = 4;
53287                            spacing = kSingle;
53288                            break;
53289                        }
53290                        unsigned last =
53291                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53292                        TransferType transfer = kMultipleLanes;
53293                        unsigned rn = (instr >> 16) & 0xf;
53294                        unsigned rm = instr & 0xf;
53295                        // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53296                        vld2(al,
53297                             dt,
53298                             NeonRegisterList(DRegister(first),
53299                                              DRegister(last),
53300                                              spacing,
53301                                              transfer),
53302                             AlignedMemOperand(Register(rn),
53303                                               align,
53304                                               Register(rm),
53305                                               PostIndex));
53306                        break;
53307                      }
53308                      case 0x00000400: {
53309                        // 0xf4200400
53310                        if (((instr & 0xd) == 0xd)) {
53311                          UnallocatedA32(instr);
53312                          return;
53313                        }
53314                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53315                        if (dt.Is(kDataTypeValueInvalid)) {
53316                          UnallocatedA32(instr);
53317                          return;
53318                        }
53319                        Alignment align =
53320                            Align_align_3_Decode((instr >> 4) & 0x3);
53321                        if (dt.Is(kDataTypeValueInvalid) ||
53322                            align.Is(kBadAlignment)) {
53323                          UnallocatedA32(instr);
53324                          return;
53325                        }
53326                        unsigned first = ExtractDRegister(instr, 22, 12);
53327                        unsigned length;
53328                        SpacingType spacing;
53329                        switch ((instr >> 8) & 0xf) {
53330                          default:
53331                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53332                          case 0x4:
53333                            length = 3;
53334                            spacing = kSingle;
53335                            break;
53336                          case 0x5:
53337                            length = 3;
53338                            spacing = kDouble;
53339                            break;
53340                        }
53341                        unsigned last =
53342                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53343                        TransferType transfer = kMultipleLanes;
53344                        unsigned rn = (instr >> 16) & 0xf;
53345                        unsigned rm = instr & 0xf;
53346                        // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53347                        vld3(al,
53348                             dt,
53349                             NeonRegisterList(DRegister(first),
53350                                              DRegister(last),
53351                                              spacing,
53352                                              transfer),
53353                             AlignedMemOperand(Register(rn),
53354                                               align,
53355                                               Register(rm),
53356                                               PostIndex));
53357                        break;
53358                      }
53359                      case 0x00000500: {
53360                        // 0xf4200500
53361                        if (((instr & 0xd) == 0xd)) {
53362                          UnallocatedA32(instr);
53363                          return;
53364                        }
53365                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53366                        if (dt.Is(kDataTypeValueInvalid)) {
53367                          UnallocatedA32(instr);
53368                          return;
53369                        }
53370                        Alignment align =
53371                            Align_align_3_Decode((instr >> 4) & 0x3);
53372                        if (dt.Is(kDataTypeValueInvalid) ||
53373                            align.Is(kBadAlignment)) {
53374                          UnallocatedA32(instr);
53375                          return;
53376                        }
53377                        unsigned first = ExtractDRegister(instr, 22, 12);
53378                        unsigned length;
53379                        SpacingType spacing;
53380                        switch ((instr >> 8) & 0xf) {
53381                          default:
53382                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53383                          case 0x4:
53384                            length = 3;
53385                            spacing = kSingle;
53386                            break;
53387                          case 0x5:
53388                            length = 3;
53389                            spacing = kDouble;
53390                            break;
53391                        }
53392                        unsigned last =
53393                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53394                        TransferType transfer = kMultipleLanes;
53395                        unsigned rn = (instr >> 16) & 0xf;
53396                        unsigned rm = instr & 0xf;
53397                        // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53398                        vld3(al,
53399                             dt,
53400                             NeonRegisterList(DRegister(first),
53401                                              DRegister(last),
53402                                              spacing,
53403                                              transfer),
53404                             AlignedMemOperand(Register(rn),
53405                                               align,
53406                                               Register(rm),
53407                                               PostIndex));
53408                        break;
53409                      }
53410                      case 0x00000600: {
53411                        // 0xf4200600
53412                        if (((instr & 0xd) == 0xd) ||
53413                            ((instr & 0xe20) == 0x620) ||
53414                            ((instr & 0xf30) == 0xa30)) {
53415                          UnallocatedA32(instr);
53416                          return;
53417                        }
53418                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53419                        if (dt.Is(kDataTypeValueInvalid)) {
53420                          UnallocatedA32(instr);
53421                          return;
53422                        }
53423                        Alignment align =
53424                            Align_align_1_Decode((instr >> 4) & 0x3);
53425                        if (dt.Is(kDataTypeValueInvalid) ||
53426                            align.Is(kBadAlignment)) {
53427                          UnallocatedA32(instr);
53428                          return;
53429                        }
53430                        unsigned first = ExtractDRegister(instr, 22, 12);
53431                        unsigned length;
53432                        SpacingType spacing = kSingle;
53433                        switch ((instr >> 8) & 0xf) {
53434                          default:
53435                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53436                          case 0x7:
53437                            length = 1;
53438                            break;
53439                          case 0xa:
53440                            length = 2;
53441                            break;
53442                          case 0x6:
53443                            length = 3;
53444                            break;
53445                          case 0x2:
53446                            length = 4;
53447                            break;
53448                        }
53449                        unsigned last = first + length - 1;
53450                        TransferType transfer = kMultipleLanes;
53451                        unsigned rn = (instr >> 16) & 0xf;
53452                        unsigned rm = instr & 0xf;
53453                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53454                        vld1(al,
53455                             dt,
53456                             NeonRegisterList(DRegister(first),
53457                                              DRegister(last),
53458                                              spacing,
53459                                              transfer),
53460                             AlignedMemOperand(Register(rn),
53461                                               align,
53462                                               Register(rm),
53463                                               PostIndex));
53464                        break;
53465                      }
53466                      case 0x00000700: {
53467                        // 0xf4200700
53468                        if (((instr & 0xd) == 0xd) ||
53469                            ((instr & 0xe20) == 0x620) ||
53470                            ((instr & 0xf30) == 0xa30)) {
53471                          UnallocatedA32(instr);
53472                          return;
53473                        }
53474                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53475                        if (dt.Is(kDataTypeValueInvalid)) {
53476                          UnallocatedA32(instr);
53477                          return;
53478                        }
53479                        Alignment align =
53480                            Align_align_1_Decode((instr >> 4) & 0x3);
53481                        if (dt.Is(kDataTypeValueInvalid) ||
53482                            align.Is(kBadAlignment)) {
53483                          UnallocatedA32(instr);
53484                          return;
53485                        }
53486                        unsigned first = ExtractDRegister(instr, 22, 12);
53487                        unsigned length;
53488                        SpacingType spacing = kSingle;
53489                        switch ((instr >> 8) & 0xf) {
53490                          default:
53491                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53492                          case 0x7:
53493                            length = 1;
53494                            break;
53495                          case 0xa:
53496                            length = 2;
53497                            break;
53498                          case 0x6:
53499                            length = 3;
53500                            break;
53501                          case 0x2:
53502                            length = 4;
53503                            break;
53504                        }
53505                        unsigned last = first + length - 1;
53506                        TransferType transfer = kMultipleLanes;
53507                        unsigned rn = (instr >> 16) & 0xf;
53508                        unsigned rm = instr & 0xf;
53509                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53510                        vld1(al,
53511                             dt,
53512                             NeonRegisterList(DRegister(first),
53513                                              DRegister(last),
53514                                              spacing,
53515                                              transfer),
53516                             AlignedMemOperand(Register(rn),
53517                                               align,
53518                                               Register(rm),
53519                                               PostIndex));
53520                        break;
53521                      }
53522                      case 0x00000800: {
53523                        // 0xf4200800
53524                        if (((instr & 0xd) == 0xd) ||
53525                            ((instr & 0xe30) == 0x830)) {
53526                          UnallocatedA32(instr);
53527                          return;
53528                        }
53529                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53530                        if (dt.Is(kDataTypeValueInvalid)) {
53531                          UnallocatedA32(instr);
53532                          return;
53533                        }
53534                        Alignment align =
53535                            Align_align_2_Decode((instr >> 4) & 0x3);
53536                        if (dt.Is(kDataTypeValueInvalid) ||
53537                            align.Is(kBadAlignment)) {
53538                          UnallocatedA32(instr);
53539                          return;
53540                        }
53541                        unsigned first = ExtractDRegister(instr, 22, 12);
53542                        unsigned length;
53543                        SpacingType spacing;
53544                        switch ((instr >> 8) & 0xf) {
53545                          default:
53546                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53547                          case 0x8:
53548                            length = 2;
53549                            spacing = kSingle;
53550                            break;
53551                          case 0x9:
53552                            length = 2;
53553                            spacing = kDouble;
53554                            break;
53555                          case 0x3:
53556                            length = 4;
53557                            spacing = kSingle;
53558                            break;
53559                        }
53560                        unsigned last =
53561                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53562                        TransferType transfer = kMultipleLanes;
53563                        unsigned rn = (instr >> 16) & 0xf;
53564                        unsigned rm = instr & 0xf;
53565                        // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53566                        vld2(al,
53567                             dt,
53568                             NeonRegisterList(DRegister(first),
53569                                              DRegister(last),
53570                                              spacing,
53571                                              transfer),
53572                             AlignedMemOperand(Register(rn),
53573                                               align,
53574                                               Register(rm),
53575                                               PostIndex));
53576                        break;
53577                      }
53578                      case 0x00000900: {
53579                        // 0xf4200900
53580                        if (((instr & 0xd) == 0xd) ||
53581                            ((instr & 0xe30) == 0x830)) {
53582                          UnallocatedA32(instr);
53583                          return;
53584                        }
53585                        DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53586                        if (dt.Is(kDataTypeValueInvalid)) {
53587                          UnallocatedA32(instr);
53588                          return;
53589                        }
53590                        Alignment align =
53591                            Align_align_2_Decode((instr >> 4) & 0x3);
53592                        if (dt.Is(kDataTypeValueInvalid) ||
53593                            align.Is(kBadAlignment)) {
53594                          UnallocatedA32(instr);
53595                          return;
53596                        }
53597                        unsigned first = ExtractDRegister(instr, 22, 12);
53598                        unsigned length;
53599                        SpacingType spacing;
53600                        switch ((instr >> 8) & 0xf) {
53601                          default:
53602                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53603                          case 0x8:
53604                            length = 2;
53605                            spacing = kSingle;
53606                            break;
53607                          case 0x9:
53608                            length = 2;
53609                            spacing = kDouble;
53610                            break;
53611                          case 0x3:
53612                            length = 4;
53613                            spacing = kSingle;
53614                            break;
53615                        }
53616                        unsigned last =
53617                            first + (length - 1) * (spacing == kSingle ? 1 : 2);
53618                        TransferType transfer = kMultipleLanes;
53619                        unsigned rn = (instr >> 16) & 0xf;
53620                        unsigned rm = instr & 0xf;
53621                        // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53622                        vld2(al,
53623                             dt,
53624                             NeonRegisterList(DRegister(first),
53625                                              DRegister(last),
53626                                              spacing,
53627                                              transfer),
53628                             AlignedMemOperand(Register(rn),
53629                                               align,
53630                                               Register(rm),
53631                                               PostIndex));
53632                        break;
53633                      }
53634                      case 0x00000a00: {
53635                        // 0xf4200a00
53636                        if (((instr & 0xd) == 0xd) ||
53637                            ((instr & 0xe20) == 0x620) ||
53638                            ((instr & 0xf30) == 0xa30)) {
53639                          UnallocatedA32(instr);
53640                          return;
53641                        }
53642                        DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53643                        if (dt.Is(kDataTypeValueInvalid)) {
53644                          UnallocatedA32(instr);
53645                          return;
53646                        }
53647                        Alignment align =
53648                            Align_align_1_Decode((instr >> 4) & 0x3);
53649                        if (dt.Is(kDataTypeValueInvalid) ||
53650                            align.Is(kBadAlignment)) {
53651                          UnallocatedA32(instr);
53652                          return;
53653                        }
53654                        unsigned first = ExtractDRegister(instr, 22, 12);
53655                        unsigned length;
53656                        SpacingType spacing = kSingle;
53657                        switch ((instr >> 8) & 0xf) {
53658                          default:
53659                            VIXL_UNREACHABLE_OR_FALLTHROUGH();
53660                          case 0x7:
53661                            length = 1;
53662                            break;
53663                          case 0xa:
53664                            length = 2;
53665                            break;
53666                          case 0x6:
53667                            length = 3;
53668                            break;
53669                          case 0x2:
53670                            length = 4;
53671                            break;
53672                        }
53673                        unsigned last = first + length - 1;
53674                        TransferType transfer = kMultipleLanes;
53675                        unsigned rn = (instr >> 16) & 0xf;
53676                        unsigned rm = instr & 0xf;
53677                        // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53678                        vld1(al,
53679                             dt,
53680                             NeonRegisterList(DRegister(first),
53681                                              DRegister(last),
53682                                              spacing,
53683                                              transfer),
53684                             AlignedMemOperand(Register(rn),
53685                                               align,
53686                                               Register(rm),
53687                                               PostIndex));
53688                        break;
53689                      }
53690                      default:
53691                        UnallocatedA32(instr);
53692                        break;
53693                    }
53694                    break;
53695                  }
53696                }
53697                break;
53698              }
53699              case 0x00800000: {
53700                // 0xf4a00000
53701                switch (instr & 0x00000300) {
53702                  case 0x00000000: {
53703                    // 0xf4a00000
53704                    switch (instr & 0x00000c00) {
53705                      case 0x00000c00: {
53706                        // 0xf4a00c00
53707                        switch (instr & 0x0000000d) {
53708                          case 0x0000000d: {
53709                            // 0xf4a00c0d
53710                            switch (instr & 0x00000002) {
53711                              case 0x00000000: {
53712                                // 0xf4a00c0d
53713                                DataType dt =
53714                                    Dt_size_7_Decode((instr >> 6) & 0x3);
53715                                if (dt.Is(kDataTypeValueInvalid)) {
53716                                  UnallocatedA32(instr);
53717                                  return;
53718                                }
53719                                Alignment align =
53720                                    Align_a_1_Decode((instr >> 4) & 0x1, dt);
53721                                if (dt.Is(kDataTypeValueInvalid) ||
53722                                    align.Is(kBadAlignment)) {
53723                                  UnallocatedA32(instr);
53724                                  return;
53725                                }
53726                                unsigned first =
53727                                    ExtractDRegister(instr, 22, 12);
53728                                unsigned length;
53729                                SpacingType spacing = kSingle;
53730                                switch ((instr >> 5) & 0x1) {
53731                                  default:
53732                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
53733                                  case 0x0:
53734                                    length = 1;
53735                                    break;
53736                                  case 0x1:
53737                                    length = 2;
53738                                    break;
53739                                }
53740                                unsigned last = first + length - 1;
53741                                TransferType transfer = kAllLanes;
53742                                unsigned rn = (instr >> 16) & 0xf;
53743                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
53744                                vld1(al,
53745                                     dt,
53746                                     NeonRegisterList(DRegister(first),
53747                                                      DRegister(last),
53748                                                      spacing,
53749                                                      transfer),
53750                                     AlignedMemOperand(Register(rn),
53751                                                       align,
53752                                                       PostIndex));
53753                                break;
53754                              }
53755                              case 0x00000002: {
53756                                // 0xf4a00c0f
53757                                DataType dt =
53758                                    Dt_size_7_Decode((instr >> 6) & 0x3);
53759                                if (dt.Is(kDataTypeValueInvalid)) {
53760                                  UnallocatedA32(instr);
53761                                  return;
53762                                }
53763                                Alignment align =
53764                                    Align_a_1_Decode((instr >> 4) & 0x1, dt);
53765                                if (dt.Is(kDataTypeValueInvalid) ||
53766                                    align.Is(kBadAlignment)) {
53767                                  UnallocatedA32(instr);
53768                                  return;
53769                                }
53770                                unsigned first =
53771                                    ExtractDRegister(instr, 22, 12);
53772                                unsigned length;
53773                                SpacingType spacing = kSingle;
53774                                switch ((instr >> 5) & 0x1) {
53775                                  default:
53776                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
53777                                  case 0x0:
53778                                    length = 1;
53779                                    break;
53780                                  case 0x1:
53781                                    length = 2;
53782                                    break;
53783                                }
53784                                unsigned last = first + length - 1;
53785                                TransferType transfer = kAllLanes;
53786                                unsigned rn = (instr >> 16) & 0xf;
53787                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
53788                                vld1(al,
53789                                     dt,
53790                                     NeonRegisterList(DRegister(first),
53791                                                      DRegister(last),
53792                                                      spacing,
53793                                                      transfer),
53794                                     AlignedMemOperand(Register(rn),
53795                                                       align,
53796                                                       Offset));
53797                                break;
53798                              }
53799                            }
53800                            break;
53801                          }
53802                          default: {
53803                            if (((instr & 0xd) == 0xd)) {
53804                              UnallocatedA32(instr);
53805                              return;
53806                            }
53807                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53808                            if (dt.Is(kDataTypeValueInvalid)) {
53809                              UnallocatedA32(instr);
53810                              return;
53811                            }
53812                            Alignment align =
53813                                Align_a_1_Decode((instr >> 4) & 0x1, dt);
53814                            if (dt.Is(kDataTypeValueInvalid) ||
53815                                align.Is(kBadAlignment)) {
53816                              UnallocatedA32(instr);
53817                              return;
53818                            }
53819                            unsigned first = ExtractDRegister(instr, 22, 12);
53820                            unsigned length;
53821                            SpacingType spacing = kSingle;
53822                            switch ((instr >> 5) & 0x1) {
53823                              default:
53824                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
53825                              case 0x0:
53826                                length = 1;
53827                                break;
53828                              case 0x1:
53829                                length = 2;
53830                                break;
53831                            }
53832                            unsigned last = first + length - 1;
53833                            TransferType transfer = kAllLanes;
53834                            unsigned rn = (instr >> 16) & 0xf;
53835                            unsigned rm = instr & 0xf;
53836                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53837                            vld1(al,
53838                                 dt,
53839                                 NeonRegisterList(DRegister(first),
53840                                                  DRegister(last),
53841                                                  spacing,
53842                                                  transfer),
53843                                 AlignedMemOperand(Register(rn),
53844                                                   align,
53845                                                   Register(rm),
53846                                                   PostIndex));
53847                            break;
53848                          }
53849                        }
53850                        break;
53851                      }
53852                      default: {
53853                        switch (instr & 0x0000000d) {
53854                          case 0x0000000d: {
53855                            // 0xf4a0000d
53856                            switch (instr & 0x00000002) {
53857                              case 0x00000000: {
53858                                // 0xf4a0000d
53859                                if (((instr & 0xc00) == 0xc00)) {
53860                                  UnallocatedA32(instr);
53861                                  return;
53862                                }
53863                                DataType dt =
53864                                    Dt_size_7_Decode((instr >> 10) & 0x3);
53865                                if (dt.Is(kDataTypeValueInvalid)) {
53866                                  UnallocatedA32(instr);
53867                                  return;
53868                                }
53869                                DecodeNeonAndAlign decode_neon =
53870                                    Align_index_align_1_Decode((instr >> 4) &
53871                                                                   0xf,
53872                                                               dt);
53873                                if (!decode_neon.IsValid()) {
53874                                  UnallocatedA32(instr);
53875                                  return;
53876                                }
53877                                Alignment align = decode_neon.GetAlign();
53878                                int lane = decode_neon.GetLane();
53879                                SpacingType spacing = decode_neon.GetSpacing();
53880                                unsigned first =
53881                                    ExtractDRegister(instr, 22, 12);
53882                                unsigned length = 1;
53883                                unsigned last = first + length - 1;
53884                                unsigned rn = (instr >> 16) & 0xf;
53885                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
53886                                vld1(al,
53887                                     dt,
53888                                     NeonRegisterList(DRegister(first),
53889                                                      DRegister(last),
53890                                                      spacing,
53891                                                      lane),
53892                                     AlignedMemOperand(Register(rn),
53893                                                       align,
53894                                                       PostIndex));
53895                                break;
53896                              }
53897                              case 0x00000002: {
53898                                // 0xf4a0000f
53899                                if (((instr & 0xc00) == 0xc00)) {
53900                                  UnallocatedA32(instr);
53901                                  return;
53902                                }
53903                                DataType dt =
53904                                    Dt_size_7_Decode((instr >> 10) & 0x3);
53905                                if (dt.Is(kDataTypeValueInvalid)) {
53906                                  UnallocatedA32(instr);
53907                                  return;
53908                                }
53909                                DecodeNeonAndAlign decode_neon =
53910                                    Align_index_align_1_Decode((instr >> 4) &
53911                                                                   0xf,
53912                                                               dt);
53913                                if (!decode_neon.IsValid()) {
53914                                  UnallocatedA32(instr);
53915                                  return;
53916                                }
53917                                Alignment align = decode_neon.GetAlign();
53918                                int lane = decode_neon.GetLane();
53919                                SpacingType spacing = decode_neon.GetSpacing();
53920                                unsigned first =
53921                                    ExtractDRegister(instr, 22, 12);
53922                                unsigned length = 1;
53923                                unsigned last = first + length - 1;
53924                                unsigned rn = (instr >> 16) & 0xf;
53925                                // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
53926                                vld1(al,
53927                                     dt,
53928                                     NeonRegisterList(DRegister(first),
53929                                                      DRegister(last),
53930                                                      spacing,
53931                                                      lane),
53932                                     AlignedMemOperand(Register(rn),
53933                                                       align,
53934                                                       Offset));
53935                                break;
53936                              }
53937                            }
53938                            break;
53939                          }
53940                          default: {
53941                            if (((instr & 0xc00) == 0xc00) ||
53942                                ((instr & 0xd) == 0xd)) {
53943                              UnallocatedA32(instr);
53944                              return;
53945                            }
53946                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
53947                            if (dt.Is(kDataTypeValueInvalid)) {
53948                              UnallocatedA32(instr);
53949                              return;
53950                            }
53951                            DecodeNeonAndAlign decode_neon =
53952                                Align_index_align_1_Decode((instr >> 4) & 0xf,
53953                                                           dt);
53954                            if (!decode_neon.IsValid()) {
53955                              UnallocatedA32(instr);
53956                              return;
53957                            }
53958                            Alignment align = decode_neon.GetAlign();
53959                            int lane = decode_neon.GetLane();
53960                            SpacingType spacing = decode_neon.GetSpacing();
53961                            unsigned first = ExtractDRegister(instr, 22, 12);
53962                            unsigned length = 1;
53963                            unsigned last = first + length - 1;
53964                            unsigned rn = (instr >> 16) & 0xf;
53965                            unsigned rm = instr & 0xf;
53966                            // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53967                            vld1(al,
53968                                 dt,
53969                                 NeonRegisterList(DRegister(first),
53970                                                  DRegister(last),
53971                                                  spacing,
53972                                                  lane),
53973                                 AlignedMemOperand(Register(rn),
53974                                                   align,
53975                                                   Register(rm),
53976                                                   PostIndex));
53977                            break;
53978                          }
53979                        }
53980                        break;
53981                      }
53982                    }
53983                    break;
53984                  }
53985                  case 0x00000100: {
53986                    // 0xf4a00100
53987                    switch (instr & 0x00000c00) {
53988                      case 0x00000c00: {
53989                        // 0xf4a00d00
53990                        switch (instr & 0x0000000d) {
53991                          case 0x0000000d: {
53992                            // 0xf4a00d0d
53993                            switch (instr & 0x00000002) {
53994                              case 0x00000000: {
53995                                // 0xf4a00d0d
53996                                DataType dt =
53997                                    Dt_size_7_Decode((instr >> 6) & 0x3);
53998                                if (dt.Is(kDataTypeValueInvalid)) {
53999                                  UnallocatedA32(instr);
54000                                  return;
54001                                }
54002                                Alignment align =
54003                                    Align_a_2_Decode((instr >> 4) & 0x1, dt);
54004                                if (dt.Is(kDataTypeValueInvalid) ||
54005                                    align.Is(kBadAlignment)) {
54006                                  UnallocatedA32(instr);
54007                                  return;
54008                                }
54009                                unsigned first =
54010                                    ExtractDRegister(instr, 22, 12);
54011                                unsigned length;
54012                                SpacingType spacing;
54013                                switch ((instr >> 5) & 0x1) {
54014                                  default:
54015                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54016                                  case 0x0:
54017                                    length = 2;
54018                                    spacing = kSingle;
54019                                    break;
54020                                  case 0x1:
54021                                    length = 2;
54022                                    spacing = kDouble;
54023                                    break;
54024                                }
54025                                unsigned last =
54026                                    first +
54027                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54028                                TransferType transfer = kAllLanes;
54029                                unsigned rn = (instr >> 16) & 0xf;
54030                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54031                                vld2(al,
54032                                     dt,
54033                                     NeonRegisterList(DRegister(first),
54034                                                      DRegister(last),
54035                                                      spacing,
54036                                                      transfer),
54037                                     AlignedMemOperand(Register(rn),
54038                                                       align,
54039                                                       PostIndex));
54040                                break;
54041                              }
54042                              case 0x00000002: {
54043                                // 0xf4a00d0f
54044                                DataType dt =
54045                                    Dt_size_7_Decode((instr >> 6) & 0x3);
54046                                if (dt.Is(kDataTypeValueInvalid)) {
54047                                  UnallocatedA32(instr);
54048                                  return;
54049                                }
54050                                Alignment align =
54051                                    Align_a_2_Decode((instr >> 4) & 0x1, dt);
54052                                if (dt.Is(kDataTypeValueInvalid) ||
54053                                    align.Is(kBadAlignment)) {
54054                                  UnallocatedA32(instr);
54055                                  return;
54056                                }
54057                                unsigned first =
54058                                    ExtractDRegister(instr, 22, 12);
54059                                unsigned length;
54060                                SpacingType spacing;
54061                                switch ((instr >> 5) & 0x1) {
54062                                  default:
54063                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54064                                  case 0x0:
54065                                    length = 2;
54066                                    spacing = kSingle;
54067                                    break;
54068                                  case 0x1:
54069                                    length = 2;
54070                                    spacing = kDouble;
54071                                    break;
54072                                }
54073                                unsigned last =
54074                                    first +
54075                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54076                                TransferType transfer = kAllLanes;
54077                                unsigned rn = (instr >> 16) & 0xf;
54078                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54079                                vld2(al,
54080                                     dt,
54081                                     NeonRegisterList(DRegister(first),
54082                                                      DRegister(last),
54083                                                      spacing,
54084                                                      transfer),
54085                                     AlignedMemOperand(Register(rn),
54086                                                       align,
54087                                                       Offset));
54088                                break;
54089                              }
54090                            }
54091                            break;
54092                          }
54093                          default: {
54094                            if (((instr & 0xd) == 0xd)) {
54095                              UnallocatedA32(instr);
54096                              return;
54097                            }
54098                            DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
54099                            if (dt.Is(kDataTypeValueInvalid)) {
54100                              UnallocatedA32(instr);
54101                              return;
54102                            }
54103                            Alignment align =
54104                                Align_a_2_Decode((instr >> 4) & 0x1, dt);
54105                            if (dt.Is(kDataTypeValueInvalid) ||
54106                                align.Is(kBadAlignment)) {
54107                              UnallocatedA32(instr);
54108                              return;
54109                            }
54110                            unsigned first = ExtractDRegister(instr, 22, 12);
54111                            unsigned length;
54112                            SpacingType spacing;
54113                            switch ((instr >> 5) & 0x1) {
54114                              default:
54115                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
54116                              case 0x0:
54117                                length = 2;
54118                                spacing = kSingle;
54119                                break;
54120                              case 0x1:
54121                                length = 2;
54122                                spacing = kDouble;
54123                                break;
54124                            }
54125                            unsigned last =
54126                                first +
54127                                (length - 1) * (spacing == kSingle ? 1 : 2);
54128                            TransferType transfer = kAllLanes;
54129                            unsigned rn = (instr >> 16) & 0xf;
54130                            unsigned rm = instr & 0xf;
54131                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54132                            vld2(al,
54133                                 dt,
54134                                 NeonRegisterList(DRegister(first),
54135                                                  DRegister(last),
54136                                                  spacing,
54137                                                  transfer),
54138                                 AlignedMemOperand(Register(rn),
54139                                                   align,
54140                                                   Register(rm),
54141                                                   PostIndex));
54142                            break;
54143                          }
54144                        }
54145                        break;
54146                      }
54147                      default: {
54148                        switch (instr & 0x0000000d) {
54149                          case 0x0000000d: {
54150                            // 0xf4a0010d
54151                            switch (instr & 0x00000002) {
54152                              case 0x00000000: {
54153                                // 0xf4a0010d
54154                                if (((instr & 0xc00) == 0xc00)) {
54155                                  UnallocatedA32(instr);
54156                                  return;
54157                                }
54158                                DataType dt =
54159                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54160                                if (dt.Is(kDataTypeValueInvalid)) {
54161                                  UnallocatedA32(instr);
54162                                  return;
54163                                }
54164                                DecodeNeonAndAlign decode_neon =
54165                                    Align_index_align_2_Decode((instr >> 4) &
54166                                                                   0xf,
54167                                                               dt);
54168                                if (!decode_neon.IsValid()) {
54169                                  UnallocatedA32(instr);
54170                                  return;
54171                                }
54172                                Alignment align = decode_neon.GetAlign();
54173                                int lane = decode_neon.GetLane();
54174                                SpacingType spacing = decode_neon.GetSpacing();
54175                                unsigned first =
54176                                    ExtractDRegister(instr, 22, 12);
54177                                unsigned length = 2;
54178                                unsigned last =
54179                                    first +
54180                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54181                                unsigned rn = (instr >> 16) & 0xf;
54182                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54183                                vld2(al,
54184                                     dt,
54185                                     NeonRegisterList(DRegister(first),
54186                                                      DRegister(last),
54187                                                      spacing,
54188                                                      lane),
54189                                     AlignedMemOperand(Register(rn),
54190                                                       align,
54191                                                       PostIndex));
54192                                break;
54193                              }
54194                              case 0x00000002: {
54195                                // 0xf4a0010f
54196                                if (((instr & 0xc00) == 0xc00)) {
54197                                  UnallocatedA32(instr);
54198                                  return;
54199                                }
54200                                DataType dt =
54201                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54202                                if (dt.Is(kDataTypeValueInvalid)) {
54203                                  UnallocatedA32(instr);
54204                                  return;
54205                                }
54206                                DecodeNeonAndAlign decode_neon =
54207                                    Align_index_align_2_Decode((instr >> 4) &
54208                                                                   0xf,
54209                                                               dt);
54210                                if (!decode_neon.IsValid()) {
54211                                  UnallocatedA32(instr);
54212                                  return;
54213                                }
54214                                Alignment align = decode_neon.GetAlign();
54215                                int lane = decode_neon.GetLane();
54216                                SpacingType spacing = decode_neon.GetSpacing();
54217                                unsigned first =
54218                                    ExtractDRegister(instr, 22, 12);
54219                                unsigned length = 2;
54220                                unsigned last =
54221                                    first +
54222                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54223                                unsigned rn = (instr >> 16) & 0xf;
54224                                // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54225                                vld2(al,
54226                                     dt,
54227                                     NeonRegisterList(DRegister(first),
54228                                                      DRegister(last),
54229                                                      spacing,
54230                                                      lane),
54231                                     AlignedMemOperand(Register(rn),
54232                                                       align,
54233                                                       Offset));
54234                                break;
54235                              }
54236                            }
54237                            break;
54238                          }
54239                          default: {
54240                            if (((instr & 0xc00) == 0xc00) ||
54241                                ((instr & 0xd) == 0xd)) {
54242                              UnallocatedA32(instr);
54243                              return;
54244                            }
54245                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54246                            if (dt.Is(kDataTypeValueInvalid)) {
54247                              UnallocatedA32(instr);
54248                              return;
54249                            }
54250                            DecodeNeonAndAlign decode_neon =
54251                                Align_index_align_2_Decode((instr >> 4) & 0xf,
54252                                                           dt);
54253                            if (!decode_neon.IsValid()) {
54254                              UnallocatedA32(instr);
54255                              return;
54256                            }
54257                            Alignment align = decode_neon.GetAlign();
54258                            int lane = decode_neon.GetLane();
54259                            SpacingType spacing = decode_neon.GetSpacing();
54260                            unsigned first = ExtractDRegister(instr, 22, 12);
54261                            unsigned length = 2;
54262                            unsigned last =
54263                                first +
54264                                (length - 1) * (spacing == kSingle ? 1 : 2);
54265                            unsigned rn = (instr >> 16) & 0xf;
54266                            unsigned rm = instr & 0xf;
54267                            // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54268                            vld2(al,
54269                                 dt,
54270                                 NeonRegisterList(DRegister(first),
54271                                                  DRegister(last),
54272                                                  spacing,
54273                                                  lane),
54274                                 AlignedMemOperand(Register(rn),
54275                                                   align,
54276                                                   Register(rm),
54277                                                   PostIndex));
54278                            break;
54279                          }
54280                        }
54281                        break;
54282                      }
54283                    }
54284                    break;
54285                  }
54286                  case 0x00000200: {
54287                    // 0xf4a00200
54288                    switch (instr & 0x00000c00) {
54289                      case 0x00000c00: {
54290                        // 0xf4a00e00
54291                        switch (instr & 0x00000010) {
54292                          case 0x00000000: {
54293                            // 0xf4a00e00
54294                            switch (instr & 0x0000000d) {
54295                              case 0x0000000d: {
54296                                // 0xf4a00e0d
54297                                switch (instr & 0x00000002) {
54298                                  case 0x00000000: {
54299                                    // 0xf4a00e0d
54300                                    DataType dt =
54301                                        Dt_size_7_Decode((instr >> 6) & 0x3);
54302                                    if (dt.Is(kDataTypeValueInvalid)) {
54303                                      UnallocatedA32(instr);
54304                                      return;
54305                                    }
54306                                    unsigned first =
54307                                        ExtractDRegister(instr, 22, 12);
54308                                    unsigned length;
54309                                    SpacingType spacing;
54310                                    switch ((instr >> 5) & 0x1) {
54311                                      default:
54312                                        VIXL_UNREACHABLE_OR_FALLTHROUGH();
54313                                      case 0x0:
54314                                        length = 3;
54315                                        spacing = kSingle;
54316                                        break;
54317                                      case 0x1:
54318                                        length = 3;
54319                                        spacing = kDouble;
54320                                        break;
54321                                    }
54322                                    unsigned last =
54323                                        first +
54324                                        (length - 1) *
54325                                            (spacing == kSingle ? 1 : 2);
54326                                    TransferType transfer = kAllLanes;
54327                                    unsigned rn = (instr >> 16) & 0xf;
54328                                    // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
54329                                    vld3(al,
54330                                         dt,
54331                                         NeonRegisterList(DRegister(first),
54332                                                          DRegister(last),
54333                                                          spacing,
54334                                                          transfer),
54335                                         MemOperand(Register(rn), PostIndex));
54336                                    break;
54337                                  }
54338                                  case 0x00000002: {
54339                                    // 0xf4a00e0f
54340                                    DataType dt =
54341                                        Dt_size_7_Decode((instr >> 6) & 0x3);
54342                                    if (dt.Is(kDataTypeValueInvalid)) {
54343                                      UnallocatedA32(instr);
54344                                      return;
54345                                    }
54346                                    unsigned first =
54347                                        ExtractDRegister(instr, 22, 12);
54348                                    unsigned length;
54349                                    SpacingType spacing;
54350                                    switch ((instr >> 5) & 0x1) {
54351                                      default:
54352                                        VIXL_UNREACHABLE_OR_FALLTHROUGH();
54353                                      case 0x0:
54354                                        length = 3;
54355                                        spacing = kSingle;
54356                                        break;
54357                                      case 0x1:
54358                                        length = 3;
54359                                        spacing = kDouble;
54360                                        break;
54361                                    }
54362                                    unsigned last =
54363                                        first +
54364                                        (length - 1) *
54365                                            (spacing == kSingle ? 1 : 2);
54366                                    TransferType transfer = kAllLanes;
54367                                    unsigned rn = (instr >> 16) & 0xf;
54368                                    // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
54369                                    vld3(al,
54370                                         dt,
54371                                         NeonRegisterList(DRegister(first),
54372                                                          DRegister(last),
54373                                                          spacing,
54374                                                          transfer),
54375                                         MemOperand(Register(rn), Offset));
54376                                    break;
54377                                  }
54378                                }
54379                                break;
54380                              }
54381                              default: {
54382                                if (((instr & 0xd) == 0xd)) {
54383                                  UnallocatedA32(instr);
54384                                  return;
54385                                }
54386                                DataType dt =
54387                                    Dt_size_7_Decode((instr >> 6) & 0x3);
54388                                if (dt.Is(kDataTypeValueInvalid)) {
54389                                  UnallocatedA32(instr);
54390                                  return;
54391                                }
54392                                unsigned first =
54393                                    ExtractDRegister(instr, 22, 12);
54394                                unsigned length;
54395                                SpacingType spacing;
54396                                switch ((instr >> 5) & 0x1) {
54397                                  default:
54398                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54399                                  case 0x0:
54400                                    length = 3;
54401                                    spacing = kSingle;
54402                                    break;
54403                                  case 0x1:
54404                                    length = 3;
54405                                    spacing = kDouble;
54406                                    break;
54407                                }
54408                                unsigned last =
54409                                    first +
54410                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54411                                TransferType transfer = kAllLanes;
54412                                unsigned rn = (instr >> 16) & 0xf;
54413                                Sign sign(plus);
54414                                unsigned rm = instr & 0xf;
54415                                // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 NOLINT(whitespace/line_length)
54416                                vld3(al,
54417                                     dt,
54418                                     NeonRegisterList(DRegister(first),
54419                                                      DRegister(last),
54420                                                      spacing,
54421                                                      transfer),
54422                                     MemOperand(Register(rn),
54423                                                sign,
54424                                                Register(rm),
54425                                                PostIndex));
54426                                break;
54427                              }
54428                            }
54429                            break;
54430                          }
54431                          default:
54432                            UnallocatedA32(instr);
54433                            break;
54434                        }
54435                        break;
54436                      }
54437                      default: {
54438                        switch (instr & 0x0000000d) {
54439                          case 0x0000000d: {
54440                            // 0xf4a0020d
54441                            switch (instr & 0x00000002) {
54442                              case 0x00000000: {
54443                                // 0xf4a0020d
54444                                if (((instr & 0xc00) == 0xc00)) {
54445                                  UnallocatedA32(instr);
54446                                  return;
54447                                }
54448                                DataType dt =
54449                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54450                                if (dt.Is(kDataTypeValueInvalid)) {
54451                                  UnallocatedA32(instr);
54452                                  return;
54453                                }
54454                                DecodeNeon decode_neon =
54455                                    Index_1_Decode((instr >> 4) & 0xf, dt);
54456                                if (!decode_neon.IsValid()) {
54457                                  UnallocatedA32(instr);
54458                                  return;
54459                                }
54460                                int lane = decode_neon.GetLane();
54461                                SpacingType spacing = decode_neon.GetSpacing();
54462                                unsigned first =
54463                                    ExtractDRegister(instr, 22, 12);
54464                                unsigned length = 3;
54465                                unsigned last =
54466                                    first +
54467                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54468                                unsigned rn = (instr >> 16) & 0xf;
54469                                // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
54470                                vld3(al,
54471                                     dt,
54472                                     NeonRegisterList(DRegister(first),
54473                                                      DRegister(last),
54474                                                      spacing,
54475                                                      lane),
54476                                     MemOperand(Register(rn), PostIndex));
54477                                break;
54478                              }
54479                              case 0x00000002: {
54480                                // 0xf4a0020f
54481                                if (((instr & 0xc00) == 0xc00)) {
54482                                  UnallocatedA32(instr);
54483                                  return;
54484                                }
54485                                DataType dt =
54486                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54487                                if (dt.Is(kDataTypeValueInvalid)) {
54488                                  UnallocatedA32(instr);
54489                                  return;
54490                                }
54491                                DecodeNeon decode_neon =
54492                                    Index_1_Decode((instr >> 4) & 0xf, dt);
54493                                if (!decode_neon.IsValid()) {
54494                                  UnallocatedA32(instr);
54495                                  return;
54496                                }
54497                                int lane = decode_neon.GetLane();
54498                                SpacingType spacing = decode_neon.GetSpacing();
54499                                unsigned first =
54500                                    ExtractDRegister(instr, 22, 12);
54501                                unsigned length = 3;
54502                                unsigned last =
54503                                    first +
54504                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54505                                unsigned rn = (instr >> 16) & 0xf;
54506                                // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
54507                                vld3(al,
54508                                     dt,
54509                                     NeonRegisterList(DRegister(first),
54510                                                      DRegister(last),
54511                                                      spacing,
54512                                                      lane),
54513                                     MemOperand(Register(rn), Offset));
54514                                break;
54515                              }
54516                            }
54517                            break;
54518                          }
54519                          default: {
54520                            if (((instr & 0xc00) == 0xc00) ||
54521                                ((instr & 0xd) == 0xd)) {
54522                              UnallocatedA32(instr);
54523                              return;
54524                            }
54525                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54526                            if (dt.Is(kDataTypeValueInvalid)) {
54527                              UnallocatedA32(instr);
54528                              return;
54529                            }
54530                            DecodeNeon decode_neon =
54531                                Index_1_Decode((instr >> 4) & 0xf, dt);
54532                            if (!decode_neon.IsValid()) {
54533                              UnallocatedA32(instr);
54534                              return;
54535                            }
54536                            int lane = decode_neon.GetLane();
54537                            SpacingType spacing = decode_neon.GetSpacing();
54538                            unsigned first = ExtractDRegister(instr, 22, 12);
54539                            unsigned length = 3;
54540                            unsigned last =
54541                                first +
54542                                (length - 1) * (spacing == kSingle ? 1 : 2);
54543                            unsigned rn = (instr >> 16) & 0xf;
54544                            Sign sign(plus);
54545                            unsigned rm = instr & 0xf;
54546                            // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
54547                            vld3(al,
54548                                 dt,
54549                                 NeonRegisterList(DRegister(first),
54550                                                  DRegister(last),
54551                                                  spacing,
54552                                                  lane),
54553                                 MemOperand(Register(rn),
54554                                            sign,
54555                                            Register(rm),
54556                                            PostIndex));
54557                            break;
54558                          }
54559                        }
54560                        break;
54561                      }
54562                    }
54563                    break;
54564                  }
54565                  case 0x00000300: {
54566                    // 0xf4a00300
54567                    switch (instr & 0x00000c00) {
54568                      case 0x00000c00: {
54569                        // 0xf4a00f00
54570                        switch (instr & 0x0000000d) {
54571                          case 0x0000000d: {
54572                            // 0xf4a00f0d
54573                            switch (instr & 0x00000002) {
54574                              case 0x00000000: {
54575                                // 0xf4a00f0d
54576                                DataType dt =
54577                                    Dt_size_8_Decode((instr >> 6) & 0x3);
54578                                if (dt.Is(kDataTypeValueInvalid)) {
54579                                  UnallocatedA32(instr);
54580                                  return;
54581                                }
54582                                Alignment align =
54583                                    Align_a_3_Decode((instr >> 4) & 0x1,
54584                                                     dt,
54585                                                     (instr >> 6) & 0x3);
54586                                if (dt.Is(kDataTypeValueInvalid) ||
54587                                    align.Is(kBadAlignment)) {
54588                                  UnallocatedA32(instr);
54589                                  return;
54590                                }
54591                                unsigned first =
54592                                    ExtractDRegister(instr, 22, 12);
54593                                unsigned length;
54594                                SpacingType spacing;
54595                                switch ((instr >> 5) & 0x1) {
54596                                  default:
54597                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54598                                  case 0x0:
54599                                    length = 4;
54600                                    spacing = kSingle;
54601                                    break;
54602                                  case 0x1:
54603                                    length = 4;
54604                                    spacing = kDouble;
54605                                    break;
54606                                }
54607                                unsigned last =
54608                                    first +
54609                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54610                                TransferType transfer = kAllLanes;
54611                                unsigned rn = (instr >> 16) & 0xf;
54612                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54613                                vld4(al,
54614                                     dt,
54615                                     NeonRegisterList(DRegister(first),
54616                                                      DRegister(last),
54617                                                      spacing,
54618                                                      transfer),
54619                                     AlignedMemOperand(Register(rn),
54620                                                       align,
54621                                                       PostIndex));
54622                                break;
54623                              }
54624                              case 0x00000002: {
54625                                // 0xf4a00f0f
54626                                DataType dt =
54627                                    Dt_size_8_Decode((instr >> 6) & 0x3);
54628                                if (dt.Is(kDataTypeValueInvalid)) {
54629                                  UnallocatedA32(instr);
54630                                  return;
54631                                }
54632                                Alignment align =
54633                                    Align_a_3_Decode((instr >> 4) & 0x1,
54634                                                     dt,
54635                                                     (instr >> 6) & 0x3);
54636                                if (dt.Is(kDataTypeValueInvalid) ||
54637                                    align.Is(kBadAlignment)) {
54638                                  UnallocatedA32(instr);
54639                                  return;
54640                                }
54641                                unsigned first =
54642                                    ExtractDRegister(instr, 22, 12);
54643                                unsigned length;
54644                                SpacingType spacing;
54645                                switch ((instr >> 5) & 0x1) {
54646                                  default:
54647                                    VIXL_UNREACHABLE_OR_FALLTHROUGH();
54648                                  case 0x0:
54649                                    length = 4;
54650                                    spacing = kSingle;
54651                                    break;
54652                                  case 0x1:
54653                                    length = 4;
54654                                    spacing = kDouble;
54655                                    break;
54656                                }
54657                                unsigned last =
54658                                    first +
54659                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54660                                TransferType transfer = kAllLanes;
54661                                unsigned rn = (instr >> 16) & 0xf;
54662                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54663                                vld4(al,
54664                                     dt,
54665                                     NeonRegisterList(DRegister(first),
54666                                                      DRegister(last),
54667                                                      spacing,
54668                                                      transfer),
54669                                     AlignedMemOperand(Register(rn),
54670                                                       align,
54671                                                       Offset));
54672                                break;
54673                              }
54674                            }
54675                            break;
54676                          }
54677                          default: {
54678                            if (((instr & 0xd) == 0xd)) {
54679                              UnallocatedA32(instr);
54680                              return;
54681                            }
54682                            DataType dt = Dt_size_8_Decode((instr >> 6) & 0x3);
54683                            if (dt.Is(kDataTypeValueInvalid)) {
54684                              UnallocatedA32(instr);
54685                              return;
54686                            }
54687                            Alignment align =
54688                                Align_a_3_Decode((instr >> 4) & 0x1,
54689                                                 dt,
54690                                                 (instr >> 6) & 0x3);
54691                            if (dt.Is(kDataTypeValueInvalid) ||
54692                                align.Is(kBadAlignment)) {
54693                              UnallocatedA32(instr);
54694                              return;
54695                            }
54696                            unsigned first = ExtractDRegister(instr, 22, 12);
54697                            unsigned length;
54698                            SpacingType spacing;
54699                            switch ((instr >> 5) & 0x1) {
54700                              default:
54701                                VIXL_UNREACHABLE_OR_FALLTHROUGH();
54702                              case 0x0:
54703                                length = 4;
54704                                spacing = kSingle;
54705                                break;
54706                              case 0x1:
54707                                length = 4;
54708                                spacing = kDouble;
54709                                break;
54710                            }
54711                            unsigned last =
54712                                first +
54713                                (length - 1) * (spacing == kSingle ? 1 : 2);
54714                            TransferType transfer = kAllLanes;
54715                            unsigned rn = (instr >> 16) & 0xf;
54716                            unsigned rm = instr & 0xf;
54717                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54718                            vld4(al,
54719                                 dt,
54720                                 NeonRegisterList(DRegister(first),
54721                                                  DRegister(last),
54722                                                  spacing,
54723                                                  transfer),
54724                                 AlignedMemOperand(Register(rn),
54725                                                   align,
54726                                                   Register(rm),
54727                                                   PostIndex));
54728                            break;
54729                          }
54730                        }
54731                        break;
54732                      }
54733                      default: {
54734                        switch (instr & 0x0000000d) {
54735                          case 0x0000000d: {
54736                            // 0xf4a0030d
54737                            switch (instr & 0x00000002) {
54738                              case 0x00000000: {
54739                                // 0xf4a0030d
54740                                if (((instr & 0xc00) == 0xc00)) {
54741                                  UnallocatedA32(instr);
54742                                  return;
54743                                }
54744                                DataType dt =
54745                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54746                                if (dt.Is(kDataTypeValueInvalid)) {
54747                                  UnallocatedA32(instr);
54748                                  return;
54749                                }
54750                                DecodeNeonAndAlign decode_neon =
54751                                    Align_index_align_3_Decode((instr >> 4) &
54752                                                                   0xf,
54753                                                               dt);
54754                                if (!decode_neon.IsValid()) {
54755                                  UnallocatedA32(instr);
54756                                  return;
54757                                }
54758                                Alignment align = decode_neon.GetAlign();
54759                                int lane = decode_neon.GetLane();
54760                                SpacingType spacing = decode_neon.GetSpacing();
54761                                unsigned first =
54762                                    ExtractDRegister(instr, 22, 12);
54763                                unsigned length = 4;
54764                                unsigned last =
54765                                    first +
54766                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54767                                unsigned rn = (instr >> 16) & 0xf;
54768                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54769                                vld4(al,
54770                                     dt,
54771                                     NeonRegisterList(DRegister(first),
54772                                                      DRegister(last),
54773                                                      spacing,
54774                                                      lane),
54775                                     AlignedMemOperand(Register(rn),
54776                                                       align,
54777                                                       PostIndex));
54778                                break;
54779                              }
54780                              case 0x00000002: {
54781                                // 0xf4a0030f
54782                                if (((instr & 0xc00) == 0xc00)) {
54783                                  UnallocatedA32(instr);
54784                                  return;
54785                                }
54786                                DataType dt =
54787                                    Dt_size_7_Decode((instr >> 10) & 0x3);
54788                                if (dt.Is(kDataTypeValueInvalid)) {
54789                                  UnallocatedA32(instr);
54790                                  return;
54791                                }
54792                                DecodeNeonAndAlign decode_neon =
54793                                    Align_index_align_3_Decode((instr >> 4) &
54794                                                                   0xf,
54795                                                               dt);
54796                                if (!decode_neon.IsValid()) {
54797                                  UnallocatedA32(instr);
54798                                  return;
54799                                }
54800                                Alignment align = decode_neon.GetAlign();
54801                                int lane = decode_neon.GetLane();
54802                                SpacingType spacing = decode_neon.GetSpacing();
54803                                unsigned first =
54804                                    ExtractDRegister(instr, 22, 12);
54805                                unsigned length = 4;
54806                                unsigned last =
54807                                    first +
54808                                    (length - 1) * (spacing == kSingle ? 1 : 2);
54809                                unsigned rn = (instr >> 16) & 0xf;
54810                                // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54811                                vld4(al,
54812                                     dt,
54813                                     NeonRegisterList(DRegister(first),
54814                                                      DRegister(last),
54815                                                      spacing,
54816                                                      lane),
54817                                     AlignedMemOperand(Register(rn),
54818                                                       align,
54819                                                       Offset));
54820                                break;
54821                              }
54822                            }
54823                            break;
54824                          }
54825                          default: {
54826                            if (((instr & 0xc00) == 0xc00) ||
54827                                ((instr & 0xd) == 0xd)) {
54828                              UnallocatedA32(instr);
54829                              return;
54830                            }
54831                            DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54832                            if (dt.Is(kDataTypeValueInvalid)) {
54833                              UnallocatedA32(instr);
54834                              return;
54835                            }
54836                            DecodeNeonAndAlign decode_neon =
54837                                Align_index_align_3_Decode((instr >> 4) & 0xf,
54838                                                           dt);
54839                            if (!decode_neon.IsValid()) {
54840                              UnallocatedA32(instr);
54841                              return;
54842                            }
54843                            Alignment align = decode_neon.GetAlign();
54844                            int lane = decode_neon.GetLane();
54845                            SpacingType spacing = decode_neon.GetSpacing();
54846                            unsigned first = ExtractDRegister(instr, 22, 12);
54847                            unsigned length = 4;
54848                            unsigned last =
54849                                first +
54850                                (length - 1) * (spacing == kSingle ? 1 : 2);
54851                            unsigned rn = (instr >> 16) & 0xf;
54852                            unsigned rm = instr & 0xf;
54853                            // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54854                            vld4(al,
54855                                 dt,
54856                                 NeonRegisterList(DRegister(first),
54857                                                  DRegister(last),
54858                                                  spacing,
54859                                                  lane),
54860                                 AlignedMemOperand(Register(rn),
54861                                                   align,
54862                                                   Register(rm),
54863                                                   PostIndex));
54864                            break;
54865                          }
54866                        }
54867                        break;
54868                      }
54869                    }
54870                    break;
54871                  }
54872                }
54873                break;
54874              }
54875            }
54876            break;
54877          }
54878          case 0x01100000: {
54879            // 0xf5100000
54880            switch (instr & 0x000f0000) {
54881              case 0x000f0000: {
54882                // 0xf51f0000
54883                uint32_t U = (instr >> 23) & 0x1;
54884                int32_t imm = instr & 0xfff;
54885                if (U == 0) imm = -imm;
54886                bool minus_zero = (imm == 0) && (U == 0);
54887                Location location(imm, kA32PcDelta);
54888                // PLD{<c>}{<q>} <label> ; A1
54889                if (minus_zero) {
54890                  pld(al, MemOperand(pc, minus, 0));
54891                } else {
54892                  pld(al, &location);
54893                }
54894                if (((instr & 0xff7ff000) != 0xf55ff000)) {
54895                  UnpredictableA32(instr);
54896                }
54897                break;
54898              }
54899              default: {
54900                switch (instr & 0x00400000) {
54901                  case 0x00000000: {
54902                    // 0xf5100000
54903                    if (((instr & 0xf0000) == 0xf0000)) {
54904                      UnallocatedA32(instr);
54905                      return;
54906                    }
54907                    unsigned rn = (instr >> 16) & 0xf;
54908                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
54909                    int32_t offset = instr & 0xfff;
54910                    // PLDW{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
54911                    pldw(al, MemOperand(Register(rn), sign, offset, Offset));
54912                    if (((instr & 0xff70f000) != 0xf510f000)) {
54913                      UnpredictableA32(instr);
54914                    }
54915                    break;
54916                  }
54917                  case 0x00400000: {
54918                    // 0xf5500000
54919                    if (((instr & 0xf0000) == 0xf0000)) {
54920                      UnallocatedA32(instr);
54921                      return;
54922                    }
54923                    unsigned rn = (instr >> 16) & 0xf;
54924                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
54925                    int32_t offset = instr & 0xfff;
54926                    // PLD{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
54927                    pld(al, MemOperand(Register(rn), sign, offset, Offset));
54928                    if (((instr & 0xff70f000) != 0xf550f000)) {
54929                      UnpredictableA32(instr);
54930                    }
54931                    break;
54932                  }
54933                }
54934                break;
54935              }
54936            }
54937            break;
54938          }
54939          case 0x01300000: {
54940            // 0xf5300000
54941            switch (instr & 0x00c000f0) {
54942              case 0x00400010: {
54943                // 0xf5700010
54944                // CLREX{<c>}{<q>} ; A1
54945                clrex(al);
54946                if (((instr & 0xffffffff) != 0xf57ff01f)) {
54947                  UnpredictableA32(instr);
54948                }
54949                break;
54950              }
54951              case 0x00400040: {
54952                // 0xf5700040
54953                MemoryBarrier option(instr & 0xf);
54954                // DSB{<c>}{<q>} {<option>} ; A1
54955                dsb(al, option);
54956                if (((instr & 0xfffffff0) != 0xf57ff040)) {
54957                  UnpredictableA32(instr);
54958                }
54959                break;
54960              }
54961              case 0x00400050: {
54962                // 0xf5700050
54963                MemoryBarrier option(instr & 0xf);
54964                // DMB{<c>}{<q>} {<option>} ; A1
54965                dmb(al, option);
54966                if (((instr & 0xfffffff0) != 0xf57ff050)) {
54967                  UnpredictableA32(instr);
54968                }
54969                break;
54970              }
54971              case 0x00400060: {
54972                // 0xf5700060
54973                MemoryBarrier option(instr & 0xf);
54974                // ISB{<c>}{<q>} {<option>} ; A1
54975                isb(al, option);
54976                if (((instr & 0xfffffff0) != 0xf57ff060)) {
54977                  UnpredictableA32(instr);
54978                }
54979                break;
54980              }
54981              default:
54982                UnallocatedA32(instr);
54983                break;
54984            }
54985            break;
54986          }
54987          default:
54988            UnallocatedA32(instr);
54989            break;
54990        }
54991        break;
54992      }
54993      case 0x06000000: {
54994        // 0xf6000000
54995        switch (instr & 0x01700010) {
54996          case 0x00500000: {
54997            // 0xf6500000
54998            switch (instr & 0x00000fe0) {
54999              case 0x00000060: {
55000                // 0xf6500060
55001                unsigned rn = (instr >> 16) & 0xf;
55002                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55003                unsigned rm = instr & 0xf;
55004                Shift shift = RRX;
55005                uint32_t amount = 0;
55006                AddrMode addrmode = Offset;
55007                // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55008                pli(al,
55009                    MemOperand(Register(rn),
55010                               sign,
55011                               Register(rm),
55012                               shift,
55013                               amount,
55014                               addrmode));
55015                if (((instr & 0xff70fff0) != 0xf650f060)) {
55016                  UnpredictableA32(instr);
55017                }
55018                break;
55019              }
55020              default: {
55021                if (((instr & 0xfe0) == 0x60)) {
55022                  UnallocatedA32(instr);
55023                  return;
55024                }
55025                unsigned rn = (instr >> 16) & 0xf;
55026                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55027                unsigned rm = instr & 0xf;
55028                ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55029                                                    (instr >> 7) & 0x1f);
55030                Shift shift = shift_operand.GetShift();
55031                uint32_t amount = shift_operand.GetAmount();
55032                AddrMode addrmode = Offset;
55033                // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55034                pli(al,
55035                    MemOperand(Register(rn),
55036                               sign,
55037                               Register(rm),
55038                               shift,
55039                               amount,
55040                               addrmode));
55041                if (((instr & 0xff70f010) != 0xf650f000)) {
55042                  UnpredictableA32(instr);
55043                }
55044                break;
55045              }
55046            }
55047            break;
55048          }
55049          case 0x01100000: {
55050            // 0xf7100000
55051            switch (instr & 0x00000fe0) {
55052              case 0x00000060: {
55053                // 0xf7100060
55054                unsigned rn = (instr >> 16) & 0xf;
55055                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55056                unsigned rm = instr & 0xf;
55057                Shift shift = RRX;
55058                uint32_t amount = 0;
55059                AddrMode addrmode = Offset;
55060                // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55061                pldw(al,
55062                     MemOperand(Register(rn),
55063                                sign,
55064                                Register(rm),
55065                                shift,
55066                                amount,
55067                                addrmode));
55068                if (((instr & 0xff70fff0) != 0xf710f060)) {
55069                  UnpredictableA32(instr);
55070                }
55071                break;
55072              }
55073              default: {
55074                if (((instr & 0xfe0) == 0x60)) {
55075                  UnallocatedA32(instr);
55076                  return;
55077                }
55078                unsigned rn = (instr >> 16) & 0xf;
55079                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55080                unsigned rm = instr & 0xf;
55081                ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55082                                                    (instr >> 7) & 0x1f);
55083                Shift shift = shift_operand.GetShift();
55084                uint32_t amount = shift_operand.GetAmount();
55085                AddrMode addrmode = Offset;
55086                // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55087                pldw(al,
55088                     MemOperand(Register(rn),
55089                                sign,
55090                                Register(rm),
55091                                shift,
55092                                amount,
55093                                addrmode));
55094                if (((instr & 0xff70f010) != 0xf710f000)) {
55095                  UnpredictableA32(instr);
55096                }
55097                break;
55098              }
55099            }
55100            break;
55101          }
55102          case 0x01500000: {
55103            // 0xf7500000
55104            switch (instr & 0x00000fe0) {
55105              case 0x00000060: {
55106                // 0xf7500060
55107                unsigned rn = (instr >> 16) & 0xf;
55108                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55109                unsigned rm = instr & 0xf;
55110                Shift shift = RRX;
55111                uint32_t amount = 0;
55112                AddrMode addrmode = Offset;
55113                // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55114                pld(al,
55115                    MemOperand(Register(rn),
55116                               sign,
55117                               Register(rm),
55118                               shift,
55119                               amount,
55120                               addrmode));
55121                if (((instr & 0xff70fff0) != 0xf750f060)) {
55122                  UnpredictableA32(instr);
55123                }
55124                break;
55125              }
55126              default: {
55127                if (((instr & 0xfe0) == 0x60)) {
55128                  UnallocatedA32(instr);
55129                  return;
55130                }
55131                unsigned rn = (instr >> 16) & 0xf;
55132                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55133                unsigned rm = instr & 0xf;
55134                ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55135                                                    (instr >> 7) & 0x1f);
55136                Shift shift = shift_operand.GetShift();
55137                uint32_t amount = shift_operand.GetAmount();
55138                AddrMode addrmode = Offset;
55139                // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55140                pld(al,
55141                    MemOperand(Register(rn),
55142                               sign,
55143                               Register(rm),
55144                               shift,
55145                               amount,
55146                               addrmode));
55147                if (((instr & 0xff70f010) != 0xf750f000)) {
55148                  UnpredictableA32(instr);
55149                }
55150                break;
55151              }
55152            }
55153            break;
55154          }
55155          default:
55156            UnallocatedA32(instr);
55157            break;
55158        }
55159        break;
55160      }
55161      case 0x08000000: {
55162        // 0xf8000000
55163        switch (instr & 0x01d00000) {
55164          case 0x00100000: {
55165            // 0xf8100000
55166            UnimplementedA32("RFEDA", instr);
55167            break;
55168          }
55169          case 0x00400000: {
55170            // 0xf8400000
55171            UnimplementedA32("SRSDA", instr);
55172            break;
55173          }
55174          case 0x00900000: {
55175            // 0xf8900000
55176            UnimplementedA32("RFE{IA}", instr);
55177            break;
55178          }
55179          case 0x00c00000: {
55180            // 0xf8c00000
55181            UnimplementedA32("SRS{IA}", instr);
55182            break;
55183          }
55184          case 0x01100000: {
55185            // 0xf9100000
55186            UnimplementedA32("RFEDB", instr);
55187            break;
55188          }
55189          case 0x01400000: {
55190            // 0xf9400000
55191            UnimplementedA32("SRSDB", instr);
55192            break;
55193          }
55194          case 0x01900000: {
55195            // 0xf9900000
55196            UnimplementedA32("RFEIB", instr);
55197            break;
55198          }
55199          case 0x01c00000: {
55200            // 0xf9c00000
55201            UnimplementedA32("SRSIB", instr);
55202            break;
55203          }
55204          default:
55205            UnallocatedA32(instr);
55206            break;
55207        }
55208        break;
55209      }
55210      case 0x0a000000: {
55211        // 0xfa000000
55212        int32_t imm = SignExtend<int32_t>((((instr >> 24) & 0x1) |
55213                                           ((instr << 1) & 0x1fffffe))
55214                                              << 1,
55215                                          26);
55216        Location location(imm, kA32PcDelta);
55217        // BLX{<c>}{<q>} <label> ; A2
55218        blx(al, &location);
55219        break;
55220      }
55221      case 0x0e000000: {
55222        // 0xfe000000
55223        switch (instr & 0x01b00f50) {
55224          case 0x00000a00: {
55225            // 0xfe000a00
55226            unsigned rd = ExtractSRegister(instr, 22, 12);
55227            unsigned rn = ExtractSRegister(instr, 7, 16);
55228            unsigned rm = ExtractSRegister(instr, 5, 0);
55229            // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; A1
55230            vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55231            break;
55232          }
55233          case 0x00000b00: {
55234            // 0xfe000b00
55235            unsigned rd = ExtractDRegister(instr, 22, 12);
55236            unsigned rn = ExtractDRegister(instr, 7, 16);
55237            unsigned rm = ExtractDRegister(instr, 5, 0);
55238            // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; A1
55239            vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55240            break;
55241          }
55242          case 0x00100a00: {
55243            // 0xfe100a00
55244            unsigned rd = ExtractSRegister(instr, 22, 12);
55245            unsigned rn = ExtractSRegister(instr, 7, 16);
55246            unsigned rm = ExtractSRegister(instr, 5, 0);
55247            // VSELVS.F32 <Sd>, <Sn>, <Sm> ; A1
55248            vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55249            break;
55250          }
55251          case 0x00100b00: {
55252            // 0xfe100b00
55253            unsigned rd = ExtractDRegister(instr, 22, 12);
55254            unsigned rn = ExtractDRegister(instr, 7, 16);
55255            unsigned rm = ExtractDRegister(instr, 5, 0);
55256            // VSELVS.F64 <Dd>, <Dn>, <Dm> ; A1
55257            vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55258            break;
55259          }
55260          case 0x00200a00: {
55261            // 0xfe200a00
55262            unsigned rd = ExtractSRegister(instr, 22, 12);
55263            unsigned rn = ExtractSRegister(instr, 7, 16);
55264            unsigned rm = ExtractSRegister(instr, 5, 0);
55265            // VSELGE.F32 <Sd>, <Sn>, <Sm> ; A1
55266            vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55267            break;
55268          }
55269          case 0x00200b00: {
55270            // 0xfe200b00
55271            unsigned rd = ExtractDRegister(instr, 22, 12);
55272            unsigned rn = ExtractDRegister(instr, 7, 16);
55273            unsigned rm = ExtractDRegister(instr, 5, 0);
55274            // VSELGE.F64 <Dd>, <Dn>, <Dm> ; A1
55275            vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55276            break;
55277          }
55278          case 0x00300a00: {
55279            // 0xfe300a00
55280            unsigned rd = ExtractSRegister(instr, 22, 12);
55281            unsigned rn = ExtractSRegister(instr, 7, 16);
55282            unsigned rm = ExtractSRegister(instr, 5, 0);
55283            // VSELGT.F32 <Sd>, <Sn>, <Sm> ; A1
55284            vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55285            break;
55286          }
55287          case 0x00300b00: {
55288            // 0xfe300b00
55289            unsigned rd = ExtractDRegister(instr, 22, 12);
55290            unsigned rn = ExtractDRegister(instr, 7, 16);
55291            unsigned rm = ExtractDRegister(instr, 5, 0);
55292            // VSELGT.F64 <Dd>, <Dn>, <Dm> ; A1
55293            vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55294            break;
55295          }
55296          case 0x00800a00: {
55297            // 0xfe800a00
55298            unsigned rd = ExtractSRegister(instr, 22, 12);
55299            unsigned rn = ExtractSRegister(instr, 7, 16);
55300            unsigned rm = ExtractSRegister(instr, 5, 0);
55301            // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
55302            vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55303            break;
55304          }
55305          case 0x00800a40: {
55306            // 0xfe800a40
55307            unsigned rd = ExtractSRegister(instr, 22, 12);
55308            unsigned rn = ExtractSRegister(instr, 7, 16);
55309            unsigned rm = ExtractSRegister(instr, 5, 0);
55310            // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
55311            vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55312            break;
55313          }
55314          case 0x00800b00: {
55315            // 0xfe800b00
55316            unsigned rd = ExtractDRegister(instr, 22, 12);
55317            unsigned rn = ExtractDRegister(instr, 7, 16);
55318            unsigned rm = ExtractDRegister(instr, 5, 0);
55319            // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
55320            vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55321            break;
55322          }
55323          case 0x00800b40: {
55324            // 0xfe800b40
55325            unsigned rd = ExtractDRegister(instr, 22, 12);
55326            unsigned rn = ExtractDRegister(instr, 7, 16);
55327            unsigned rm = ExtractDRegister(instr, 5, 0);
55328            // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
55329            vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55330            break;
55331          }
55332          case 0x00b00a40: {
55333            // 0xfeb00a40
55334            switch (instr & 0x000f0000) {
55335              case 0x00080000: {
55336                // 0xfeb80a40
55337                if ((instr & 0x00000080) == 0x00000000) {
55338                  unsigned rd = ExtractSRegister(instr, 22, 12);
55339                  unsigned rm = ExtractSRegister(instr, 5, 0);
55340                  // VRINTA{<q>}.F32 <Sd>, <Sm> ; A1
55341                  vrinta(F32, SRegister(rd), SRegister(rm));
55342                } else {
55343                  UnallocatedA32(instr);
55344                }
55345                break;
55346              }
55347              case 0x00090000: {
55348                // 0xfeb90a40
55349                if ((instr & 0x00000080) == 0x00000000) {
55350                  unsigned rd = ExtractSRegister(instr, 22, 12);
55351                  unsigned rm = ExtractSRegister(instr, 5, 0);
55352                  // VRINTN{<q>}.F32 <Sd>, <Sm> ; A1
55353                  vrintn(F32, SRegister(rd), SRegister(rm));
55354                } else {
55355                  UnallocatedA32(instr);
55356                }
55357                break;
55358              }
55359              case 0x000a0000: {
55360                // 0xfeba0a40
55361                if ((instr & 0x00000080) == 0x00000000) {
55362                  unsigned rd = ExtractSRegister(instr, 22, 12);
55363                  unsigned rm = ExtractSRegister(instr, 5, 0);
55364                  // VRINTP{<q>}.F32 <Sd>, <Sm> ; A1
55365                  vrintp(F32, SRegister(rd), SRegister(rm));
55366                } else {
55367                  UnallocatedA32(instr);
55368                }
55369                break;
55370              }
55371              case 0x000b0000: {
55372                // 0xfebb0a40
55373                if ((instr & 0x00000080) == 0x00000000) {
55374                  unsigned rd = ExtractSRegister(instr, 22, 12);
55375                  unsigned rm = ExtractSRegister(instr, 5, 0);
55376                  // VRINTM{<q>}.F32 <Sd>, <Sm> ; A1
55377                  vrintm(F32, SRegister(rd), SRegister(rm));
55378                } else {
55379                  UnallocatedA32(instr);
55380                }
55381                break;
55382              }
55383              case 0x000c0000: {
55384                // 0xfebc0a40
55385                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55386                if (dt.Is(kDataTypeValueInvalid)) {
55387                  UnallocatedA32(instr);
55388                  return;
55389                }
55390                unsigned rd = ExtractSRegister(instr, 22, 12);
55391                unsigned rm = ExtractSRegister(instr, 5, 0);
55392                // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55393                vcvta(dt, F32, SRegister(rd), SRegister(rm));
55394                break;
55395              }
55396              case 0x000d0000: {
55397                // 0xfebd0a40
55398                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55399                if (dt.Is(kDataTypeValueInvalid)) {
55400                  UnallocatedA32(instr);
55401                  return;
55402                }
55403                unsigned rd = ExtractSRegister(instr, 22, 12);
55404                unsigned rm = ExtractSRegister(instr, 5, 0);
55405                // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55406                vcvtn(dt, F32, SRegister(rd), SRegister(rm));
55407                break;
55408              }
55409              case 0x000e0000: {
55410                // 0xfebe0a40
55411                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55412                if (dt.Is(kDataTypeValueInvalid)) {
55413                  UnallocatedA32(instr);
55414                  return;
55415                }
55416                unsigned rd = ExtractSRegister(instr, 22, 12);
55417                unsigned rm = ExtractSRegister(instr, 5, 0);
55418                // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55419                vcvtp(dt, F32, SRegister(rd), SRegister(rm));
55420                break;
55421              }
55422              case 0x000f0000: {
55423                // 0xfebf0a40
55424                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55425                if (dt.Is(kDataTypeValueInvalid)) {
55426                  UnallocatedA32(instr);
55427                  return;
55428                }
55429                unsigned rd = ExtractSRegister(instr, 22, 12);
55430                unsigned rm = ExtractSRegister(instr, 5, 0);
55431                // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55432                vcvtm(dt, F32, SRegister(rd), SRegister(rm));
55433                break;
55434              }
55435              default:
55436                UnallocatedA32(instr);
55437                break;
55438            }
55439            break;
55440          }
55441          case 0x00b00b40: {
55442            // 0xfeb00b40
55443            switch (instr & 0x000f0000) {
55444              case 0x00080000: {
55445                // 0xfeb80b40
55446                if ((instr & 0x00000080) == 0x00000000) {
55447                  unsigned rd = ExtractDRegister(instr, 22, 12);
55448                  unsigned rm = ExtractDRegister(instr, 5, 0);
55449                  // VRINTA{<q>}.F64 <Dd>, <Dm> ; A1
55450                  vrinta(F64, DRegister(rd), DRegister(rm));
55451                } else {
55452                  UnallocatedA32(instr);
55453                }
55454                break;
55455              }
55456              case 0x00090000: {
55457                // 0xfeb90b40
55458                if ((instr & 0x00000080) == 0x00000000) {
55459                  unsigned rd = ExtractDRegister(instr, 22, 12);
55460                  unsigned rm = ExtractDRegister(instr, 5, 0);
55461                  // VRINTN{<q>}.F64 <Dd>, <Dm> ; A1
55462                  vrintn(F64, DRegister(rd), DRegister(rm));
55463                } else {
55464                  UnallocatedA32(instr);
55465                }
55466                break;
55467              }
55468              case 0x000a0000: {
55469                // 0xfeba0b40
55470                if ((instr & 0x00000080) == 0x00000000) {
55471                  unsigned rd = ExtractDRegister(instr, 22, 12);
55472                  unsigned rm = ExtractDRegister(instr, 5, 0);
55473                  // VRINTP{<q>}.F64 <Dd>, <Dm> ; A1
55474                  vrintp(F64, DRegister(rd), DRegister(rm));
55475                } else {
55476                  UnallocatedA32(instr);
55477                }
55478                break;
55479              }
55480              case 0x000b0000: {
55481                // 0xfebb0b40
55482                if ((instr & 0x00000080) == 0x00000000) {
55483                  unsigned rd = ExtractDRegister(instr, 22, 12);
55484                  unsigned rm = ExtractDRegister(instr, 5, 0);
55485                  // VRINTM{<q>}.F64 <Dd>, <Dm> ; A1
55486                  vrintm(F64, DRegister(rd), DRegister(rm));
55487                } else {
55488                  UnallocatedA32(instr);
55489                }
55490                break;
55491              }
55492              case 0x000c0000: {
55493                // 0xfebc0b40
55494                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55495                if (dt.Is(kDataTypeValueInvalid)) {
55496                  UnallocatedA32(instr);
55497                  return;
55498                }
55499                unsigned rd = ExtractSRegister(instr, 22, 12);
55500                unsigned rm = ExtractDRegister(instr, 5, 0);
55501                // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
55502                vcvta(dt, F64, SRegister(rd), DRegister(rm));
55503                break;
55504              }
55505              case 0x000d0000: {
55506                // 0xfebd0b40
55507                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55508                if (dt.Is(kDataTypeValueInvalid)) {
55509                  UnallocatedA32(instr);
55510                  return;
55511                }
55512                unsigned rd = ExtractSRegister(instr, 22, 12);
55513                unsigned rm = ExtractDRegister(instr, 5, 0);
55514                // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
55515                vcvtn(dt, F64, SRegister(rd), DRegister(rm));
55516                break;
55517              }
55518              case 0x000e0000: {
55519                // 0xfebe0b40
55520                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55521                if (dt.Is(kDataTypeValueInvalid)) {
55522                  UnallocatedA32(instr);
55523                  return;
55524                }
55525                unsigned rd = ExtractSRegister(instr, 22, 12);
55526                unsigned rm = ExtractDRegister(instr, 5, 0);
55527                // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
55528                vcvtp(dt, F64, SRegister(rd), DRegister(rm));
55529                break;
55530              }
55531              case 0x000f0000: {
55532                // 0xfebf0b40
55533                DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55534                if (dt.Is(kDataTypeValueInvalid)) {
55535                  UnallocatedA32(instr);
55536                  return;
55537                }
55538                unsigned rd = ExtractSRegister(instr, 22, 12);
55539                unsigned rm = ExtractDRegister(instr, 5, 0);
55540                // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
55541                vcvtm(dt, F64, SRegister(rd), DRegister(rm));
55542                break;
55543              }
55544              default:
55545                UnallocatedA32(instr);
55546                break;
55547            }
55548            break;
55549          }
55550          default:
55551            UnallocatedA32(instr);
55552            break;
55553        }
55554        break;
55555      }
55556      default:
55557        UnallocatedA32(instr);
55558        break;
55559    }
55560  } else {
55561    switch (instr & 0x0e000000) {
55562      case 0x00000000: {
55563        // 0x00000000
55564        switch (instr & 0x00100010) {
55565          case 0x00000000: {
55566            // 0x00000000
55567            switch (instr & 0x01a00000) {
55568              case 0x00000000: {
55569                // 0x00000000
55570                switch (instr & 0x00400000) {
55571                  case 0x00000000: {
55572                    // 0x00000000
55573                    switch (instr & 0x00000fe0) {
55574                      case 0x00000060: {
55575                        // 0x00000060
55576                        if (((instr & 0xf0000000) == 0xf0000000)) {
55577                          UnallocatedA32(instr);
55578                          return;
55579                        }
55580                        Condition condition((instr >> 28) & 0xf);
55581                        unsigned rd = (instr >> 12) & 0xf;
55582                        unsigned rn = (instr >> 16) & 0xf;
55583                        unsigned rm = instr & 0xf;
55584                        // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55585                        and_(condition,
55586                             Best,
55587                             Register(rd),
55588                             Register(rn),
55589                             Operand(Register(rm), RRX));
55590                        break;
55591                      }
55592                      default: {
55593                        if (((instr & 0xf0000000) == 0xf0000000) ||
55594                            ((instr & 0xfe0) == 0x60)) {
55595                          UnallocatedA32(instr);
55596                          return;
55597                        }
55598                        Condition condition((instr >> 28) & 0xf);
55599                        unsigned rd = (instr >> 12) & 0xf;
55600                        unsigned rn = (instr >> 16) & 0xf;
55601                        unsigned rm = instr & 0xf;
55602                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55603                                                            (instr >> 7) &
55604                                                                0x1f);
55605                        // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55606                        and_(condition,
55607                             Best,
55608                             Register(rd),
55609                             Register(rn),
55610                             Operand(Register(rm),
55611                                     shift_operand.GetType(),
55612                                     shift_operand.GetAmount()));
55613                        break;
55614                      }
55615                    }
55616                    break;
55617                  }
55618                  case 0x00400000: {
55619                    // 0x00400000
55620                    switch (instr & 0x000f0000) {
55621                      case 0x000d0000: {
55622                        // 0x004d0000
55623                        switch (instr & 0x00000fe0) {
55624                          case 0x00000060: {
55625                            // 0x004d0060
55626                            if (((instr & 0xf0000000) == 0xf0000000)) {
55627                              UnallocatedA32(instr);
55628                              return;
55629                            }
55630                            Condition condition((instr >> 28) & 0xf);
55631                            unsigned rd = (instr >> 12) & 0xf;
55632                            unsigned rm = instr & 0xf;
55633                            // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
55634                            sub(condition,
55635                                Best,
55636                                Register(rd),
55637                                sp,
55638                                Operand(Register(rm), RRX));
55639                            break;
55640                          }
55641                          default: {
55642                            if (((instr & 0xf0000000) == 0xf0000000) ||
55643                                ((instr & 0xfe0) == 0x60)) {
55644                              UnallocatedA32(instr);
55645                              return;
55646                            }
55647                            Condition condition((instr >> 28) & 0xf);
55648                            unsigned rd = (instr >> 12) & 0xf;
55649                            unsigned rm = instr & 0xf;
55650                            ImmediateShiftOperand shift_operand((instr >> 5) &
55651                                                                    0x3,
55652                                                                (instr >> 7) &
55653                                                                    0x1f);
55654                            // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55655                            sub(condition,
55656                                Best,
55657                                Register(rd),
55658                                sp,
55659                                Operand(Register(rm),
55660                                        shift_operand.GetType(),
55661                                        shift_operand.GetAmount()));
55662                            break;
55663                          }
55664                        }
55665                        break;
55666                      }
55667                      default: {
55668                        switch (instr & 0x00000fe0) {
55669                          case 0x00000060: {
55670                            // 0x00400060
55671                            if (((instr & 0xf0000000) == 0xf0000000) ||
55672                                ((instr & 0xf0000) == 0xd0000)) {
55673                              UnallocatedA32(instr);
55674                              return;
55675                            }
55676                            Condition condition((instr >> 28) & 0xf);
55677                            unsigned rd = (instr >> 12) & 0xf;
55678                            unsigned rn = (instr >> 16) & 0xf;
55679                            unsigned rm = instr & 0xf;
55680                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55681                            sub(condition,
55682                                Best,
55683                                Register(rd),
55684                                Register(rn),
55685                                Operand(Register(rm), RRX));
55686                            break;
55687                          }
55688                          default: {
55689                            if (((instr & 0xf0000000) == 0xf0000000) ||
55690                                ((instr & 0xf0000) == 0xd0000) ||
55691                                ((instr & 0xfe0) == 0x60)) {
55692                              UnallocatedA32(instr);
55693                              return;
55694                            }
55695                            Condition condition((instr >> 28) & 0xf);
55696                            unsigned rd = (instr >> 12) & 0xf;
55697                            unsigned rn = (instr >> 16) & 0xf;
55698                            unsigned rm = instr & 0xf;
55699                            ImmediateShiftOperand shift_operand((instr >> 5) &
55700                                                                    0x3,
55701                                                                (instr >> 7) &
55702                                                                    0x1f);
55703                            // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55704                            sub(condition,
55705                                Best,
55706                                Register(rd),
55707                                Register(rn),
55708                                Operand(Register(rm),
55709                                        shift_operand.GetType(),
55710                                        shift_operand.GetAmount()));
55711                            break;
55712                          }
55713                        }
55714                        break;
55715                      }
55716                    }
55717                    break;
55718                  }
55719                }
55720                break;
55721              }
55722              case 0x00200000: {
55723                // 0x00200000
55724                switch (instr & 0x00400000) {
55725                  case 0x00000000: {
55726                    // 0x00200000
55727                    switch (instr & 0x00000fe0) {
55728                      case 0x00000060: {
55729                        // 0x00200060
55730                        if (((instr & 0xf0000000) == 0xf0000000)) {
55731                          UnallocatedA32(instr);
55732                          return;
55733                        }
55734                        Condition condition((instr >> 28) & 0xf);
55735                        unsigned rd = (instr >> 12) & 0xf;
55736                        unsigned rn = (instr >> 16) & 0xf;
55737                        unsigned rm = instr & 0xf;
55738                        // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55739                        eor(condition,
55740                            Best,
55741                            Register(rd),
55742                            Register(rn),
55743                            Operand(Register(rm), RRX));
55744                        break;
55745                      }
55746                      default: {
55747                        if (((instr & 0xf0000000) == 0xf0000000) ||
55748                            ((instr & 0xfe0) == 0x60)) {
55749                          UnallocatedA32(instr);
55750                          return;
55751                        }
55752                        Condition condition((instr >> 28) & 0xf);
55753                        unsigned rd = (instr >> 12) & 0xf;
55754                        unsigned rn = (instr >> 16) & 0xf;
55755                        unsigned rm = instr & 0xf;
55756                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55757                                                            (instr >> 7) &
55758                                                                0x1f);
55759                        // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55760                        eor(condition,
55761                            Best,
55762                            Register(rd),
55763                            Register(rn),
55764                            Operand(Register(rm),
55765                                    shift_operand.GetType(),
55766                                    shift_operand.GetAmount()));
55767                        break;
55768                      }
55769                    }
55770                    break;
55771                  }
55772                  case 0x00400000: {
55773                    // 0x00600000
55774                    switch (instr & 0x00000fe0) {
55775                      case 0x00000060: {
55776                        // 0x00600060
55777                        if (((instr & 0xf0000000) == 0xf0000000)) {
55778                          UnallocatedA32(instr);
55779                          return;
55780                        }
55781                        Condition condition((instr >> 28) & 0xf);
55782                        unsigned rd = (instr >> 12) & 0xf;
55783                        unsigned rn = (instr >> 16) & 0xf;
55784                        unsigned rm = instr & 0xf;
55785                        // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55786                        rsb(condition,
55787                            Best,
55788                            Register(rd),
55789                            Register(rn),
55790                            Operand(Register(rm), RRX));
55791                        break;
55792                      }
55793                      default: {
55794                        if (((instr & 0xf0000000) == 0xf0000000) ||
55795                            ((instr & 0xfe0) == 0x60)) {
55796                          UnallocatedA32(instr);
55797                          return;
55798                        }
55799                        Condition condition((instr >> 28) & 0xf);
55800                        unsigned rd = (instr >> 12) & 0xf;
55801                        unsigned rn = (instr >> 16) & 0xf;
55802                        unsigned rm = instr & 0xf;
55803                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55804                                                            (instr >> 7) &
55805                                                                0x1f);
55806                        // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55807                        rsb(condition,
55808                            Best,
55809                            Register(rd),
55810                            Register(rn),
55811                            Operand(Register(rm),
55812                                    shift_operand.GetType(),
55813                                    shift_operand.GetAmount()));
55814                        break;
55815                      }
55816                    }
55817                    break;
55818                  }
55819                }
55820                break;
55821              }
55822              case 0x00800000: {
55823                // 0x00800000
55824                switch (instr & 0x00400000) {
55825                  case 0x00000000: {
55826                    // 0x00800000
55827                    switch (instr & 0x000f0000) {
55828                      case 0x000d0000: {
55829                        // 0x008d0000
55830                        switch (instr & 0x00000fe0) {
55831                          case 0x00000060: {
55832                            // 0x008d0060
55833                            if (((instr & 0xf0000000) == 0xf0000000)) {
55834                              UnallocatedA32(instr);
55835                              return;
55836                            }
55837                            Condition condition((instr >> 28) & 0xf);
55838                            unsigned rd = (instr >> 12) & 0xf;
55839                            unsigned rm = instr & 0xf;
55840                            // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
55841                            add(condition,
55842                                Best,
55843                                Register(rd),
55844                                sp,
55845                                Operand(Register(rm), RRX));
55846                            break;
55847                          }
55848                          default: {
55849                            if (((instr & 0xf0000000) == 0xf0000000) ||
55850                                ((instr & 0xfe0) == 0x60)) {
55851                              UnallocatedA32(instr);
55852                              return;
55853                            }
55854                            Condition condition((instr >> 28) & 0xf);
55855                            unsigned rd = (instr >> 12) & 0xf;
55856                            unsigned rm = instr & 0xf;
55857                            ImmediateShiftOperand shift_operand((instr >> 5) &
55858                                                                    0x3,
55859                                                                (instr >> 7) &
55860                                                                    0x1f);
55861                            // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55862                            add(condition,
55863                                Best,
55864                                Register(rd),
55865                                sp,
55866                                Operand(Register(rm),
55867                                        shift_operand.GetType(),
55868                                        shift_operand.GetAmount()));
55869                            break;
55870                          }
55871                        }
55872                        break;
55873                      }
55874                      default: {
55875                        switch (instr & 0x00000fe0) {
55876                          case 0x00000060: {
55877                            // 0x00800060
55878                            if (((instr & 0xf0000000) == 0xf0000000) ||
55879                                ((instr & 0xf0000) == 0xd0000)) {
55880                              UnallocatedA32(instr);
55881                              return;
55882                            }
55883                            Condition condition((instr >> 28) & 0xf);
55884                            unsigned rd = (instr >> 12) & 0xf;
55885                            unsigned rn = (instr >> 16) & 0xf;
55886                            unsigned rm = instr & 0xf;
55887                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55888                            add(condition,
55889                                Best,
55890                                Register(rd),
55891                                Register(rn),
55892                                Operand(Register(rm), RRX));
55893                            break;
55894                          }
55895                          default: {
55896                            if (((instr & 0xf0000000) == 0xf0000000) ||
55897                                ((instr & 0xf0000) == 0xd0000) ||
55898                                ((instr & 0xfe0) == 0x60)) {
55899                              UnallocatedA32(instr);
55900                              return;
55901                            }
55902                            Condition condition((instr >> 28) & 0xf);
55903                            unsigned rd = (instr >> 12) & 0xf;
55904                            unsigned rn = (instr >> 16) & 0xf;
55905                            unsigned rm = instr & 0xf;
55906                            ImmediateShiftOperand shift_operand((instr >> 5) &
55907                                                                    0x3,
55908                                                                (instr >> 7) &
55909                                                                    0x1f);
55910                            // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55911                            add(condition,
55912                                Best,
55913                                Register(rd),
55914                                Register(rn),
55915                                Operand(Register(rm),
55916                                        shift_operand.GetType(),
55917                                        shift_operand.GetAmount()));
55918                            break;
55919                          }
55920                        }
55921                        break;
55922                      }
55923                    }
55924                    break;
55925                  }
55926                  case 0x00400000: {
55927                    // 0x00c00000
55928                    switch (instr & 0x00000fe0) {
55929                      case 0x00000060: {
55930                        // 0x00c00060
55931                        if (((instr & 0xf0000000) == 0xf0000000)) {
55932                          UnallocatedA32(instr);
55933                          return;
55934                        }
55935                        Condition condition((instr >> 28) & 0xf);
55936                        unsigned rd = (instr >> 12) & 0xf;
55937                        unsigned rn = (instr >> 16) & 0xf;
55938                        unsigned rm = instr & 0xf;
55939                        // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55940                        sbc(condition,
55941                            Best,
55942                            Register(rd),
55943                            Register(rn),
55944                            Operand(Register(rm), RRX));
55945                        break;
55946                      }
55947                      default: {
55948                        if (((instr & 0xf0000000) == 0xf0000000) ||
55949                            ((instr & 0xfe0) == 0x60)) {
55950                          UnallocatedA32(instr);
55951                          return;
55952                        }
55953                        Condition condition((instr >> 28) & 0xf);
55954                        unsigned rd = (instr >> 12) & 0xf;
55955                        unsigned rn = (instr >> 16) & 0xf;
55956                        unsigned rm = instr & 0xf;
55957                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55958                                                            (instr >> 7) &
55959                                                                0x1f);
55960                        // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
55961                        sbc(condition,
55962                            Best,
55963                            Register(rd),
55964                            Register(rn),
55965                            Operand(Register(rm),
55966                                    shift_operand.GetType(),
55967                                    shift_operand.GetAmount()));
55968                        break;
55969                      }
55970                    }
55971                    break;
55972                  }
55973                }
55974                break;
55975              }
55976              case 0x00a00000: {
55977                // 0x00a00000
55978                switch (instr & 0x00400000) {
55979                  case 0x00000000: {
55980                    // 0x00a00000
55981                    switch (instr & 0x00000fe0) {
55982                      case 0x00000060: {
55983                        // 0x00a00060
55984                        if (((instr & 0xf0000000) == 0xf0000000)) {
55985                          UnallocatedA32(instr);
55986                          return;
55987                        }
55988                        Condition condition((instr >> 28) & 0xf);
55989                        unsigned rd = (instr >> 12) & 0xf;
55990                        unsigned rn = (instr >> 16) & 0xf;
55991                        unsigned rm = instr & 0xf;
55992                        // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
55993                        adc(condition,
55994                            Best,
55995                            Register(rd),
55996                            Register(rn),
55997                            Operand(Register(rm), RRX));
55998                        break;
55999                      }
56000                      default: {
56001                        if (((instr & 0xf0000000) == 0xf0000000) ||
56002                            ((instr & 0xfe0) == 0x60)) {
56003                          UnallocatedA32(instr);
56004                          return;
56005                        }
56006                        Condition condition((instr >> 28) & 0xf);
56007                        unsigned rd = (instr >> 12) & 0xf;
56008                        unsigned rn = (instr >> 16) & 0xf;
56009                        unsigned rm = instr & 0xf;
56010                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56011                                                            (instr >> 7) &
56012                                                                0x1f);
56013                        // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56014                        adc(condition,
56015                            Best,
56016                            Register(rd),
56017                            Register(rn),
56018                            Operand(Register(rm),
56019                                    shift_operand.GetType(),
56020                                    shift_operand.GetAmount()));
56021                        break;
56022                      }
56023                    }
56024                    break;
56025                  }
56026                  case 0x00400000: {
56027                    // 0x00e00000
56028                    switch (instr & 0x00000fe0) {
56029                      case 0x00000060: {
56030                        // 0x00e00060
56031                        if (((instr & 0xf0000000) == 0xf0000000)) {
56032                          UnallocatedA32(instr);
56033                          return;
56034                        }
56035                        Condition condition((instr >> 28) & 0xf);
56036                        unsigned rd = (instr >> 12) & 0xf;
56037                        unsigned rn = (instr >> 16) & 0xf;
56038                        unsigned rm = instr & 0xf;
56039                        // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56040                        rsc(condition,
56041                            Register(rd),
56042                            Register(rn),
56043                            Operand(Register(rm), RRX));
56044                        break;
56045                      }
56046                      default: {
56047                        if (((instr & 0xf0000000) == 0xf0000000) ||
56048                            ((instr & 0xfe0) == 0x60)) {
56049                          UnallocatedA32(instr);
56050                          return;
56051                        }
56052                        Condition condition((instr >> 28) & 0xf);
56053                        unsigned rd = (instr >> 12) & 0xf;
56054                        unsigned rn = (instr >> 16) & 0xf;
56055                        unsigned rm = instr & 0xf;
56056                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56057                                                            (instr >> 7) &
56058                                                                0x1f);
56059                        // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56060                        rsc(condition,
56061                            Register(rd),
56062                            Register(rn),
56063                            Operand(Register(rm),
56064                                    shift_operand.GetType(),
56065                                    shift_operand.GetAmount()));
56066                        break;
56067                      }
56068                    }
56069                    break;
56070                  }
56071                }
56072                break;
56073              }
56074              case 0x01000000: {
56075                // 0x01000000
56076                switch (instr & 0x000000e0) {
56077                  case 0x00000000: {
56078                    // 0x01000000
56079                    switch (instr & 0x00000200) {
56080                      case 0x00000000: {
56081                        // 0x01000000
56082                        if (((instr & 0xf0000000) == 0xf0000000)) {
56083                          UnallocatedA32(instr);
56084                          return;
56085                        }
56086                        Condition condition((instr >> 28) & 0xf);
56087                        unsigned rd = (instr >> 12) & 0xf;
56088                        unsigned spec_reg = (instr >> 22) & 0x1;
56089                        // MRS{<c>}{<q>} <Rd>, <spec_reg> ; A1
56090                        mrs(condition, Register(rd), SpecialRegister(spec_reg));
56091                        if (((instr & 0xfbf0fff) != 0x10f0000)) {
56092                          UnpredictableA32(instr);
56093                        }
56094                        break;
56095                      }
56096                      case 0x00000200: {
56097                        // 0x01000200
56098                        if (((instr & 0xf0000000) == 0xf0000000)) {
56099                          UnallocatedA32(instr);
56100                          return;
56101                        }
56102                        UnimplementedA32("MRS", instr);
56103                        break;
56104                      }
56105                    }
56106                    break;
56107                  }
56108                  case 0x00000040: {
56109                    // 0x01000040
56110                    switch (instr & 0x00400200) {
56111                      case 0x00000000: {
56112                        // 0x01000040
56113                        if (((instr & 0xf0000000) == 0xf0000000)) {
56114                          UnallocatedA32(instr);
56115                          return;
56116                        }
56117                        unsigned rd = (instr >> 12) & 0xf;
56118                        unsigned rn = (instr >> 16) & 0xf;
56119                        unsigned rm = instr & 0xf;
56120                        // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; A1
56121                        crc32b(al, Register(rd), Register(rn), Register(rm));
56122                        if (((instr & 0xff00ff0) != 0x1000040)) {
56123                          UnpredictableA32(instr);
56124                        }
56125                        break;
56126                      }
56127                      case 0x00000200: {
56128                        // 0x01000240
56129                        if (((instr & 0xf0000000) == 0xf0000000)) {
56130                          UnallocatedA32(instr);
56131                          return;
56132                        }
56133                        unsigned rd = (instr >> 12) & 0xf;
56134                        unsigned rn = (instr >> 16) & 0xf;
56135                        unsigned rm = instr & 0xf;
56136                        // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; A1
56137                        crc32cb(al, Register(rd), Register(rn), Register(rm));
56138                        if (((instr & 0xff00ff0) != 0x1000240)) {
56139                          UnpredictableA32(instr);
56140                        }
56141                        break;
56142                      }
56143                      case 0x00400000: {
56144                        // 0x01400040
56145                        if (((instr & 0xf0000000) == 0xf0000000)) {
56146                          UnallocatedA32(instr);
56147                          return;
56148                        }
56149                        unsigned rd = (instr >> 12) & 0xf;
56150                        unsigned rn = (instr >> 16) & 0xf;
56151                        unsigned rm = instr & 0xf;
56152                        // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; A1
56153                        crc32w(al, Register(rd), Register(rn), Register(rm));
56154                        if (((instr & 0xff00ff0) != 0x1400040)) {
56155                          UnpredictableA32(instr);
56156                        }
56157                        break;
56158                      }
56159                      case 0x00400200: {
56160                        // 0x01400240
56161                        if (((instr & 0xf0000000) == 0xf0000000)) {
56162                          UnallocatedA32(instr);
56163                          return;
56164                        }
56165                        unsigned rd = (instr >> 12) & 0xf;
56166                        unsigned rn = (instr >> 16) & 0xf;
56167                        unsigned rm = instr & 0xf;
56168                        // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; A1
56169                        crc32cw(al, Register(rd), Register(rn), Register(rm));
56170                        if (((instr & 0xff00ff0) != 0x1400240)) {
56171                          UnpredictableA32(instr);
56172                        }
56173                        break;
56174                      }
56175                    }
56176                    break;
56177                  }
56178                  case 0x00000080: {
56179                    // 0x01000080
56180                    switch (instr & 0x00400000) {
56181                      case 0x00000000: {
56182                        // 0x01000080
56183                        if (((instr & 0xf0000000) == 0xf0000000)) {
56184                          UnallocatedA32(instr);
56185                          return;
56186                        }
56187                        Condition condition((instr >> 28) & 0xf);
56188                        unsigned rd = (instr >> 16) & 0xf;
56189                        unsigned rn = instr & 0xf;
56190                        unsigned rm = (instr >> 8) & 0xf;
56191                        unsigned ra = (instr >> 12) & 0xf;
56192                        // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56193                        smlabb(condition,
56194                               Register(rd),
56195                               Register(rn),
56196                               Register(rm),
56197                               Register(ra));
56198                        break;
56199                      }
56200                      case 0x00400000: {
56201                        // 0x01400080
56202                        if (((instr & 0xf0000000) == 0xf0000000)) {
56203                          UnallocatedA32(instr);
56204                          return;
56205                        }
56206                        Condition condition((instr >> 28) & 0xf);
56207                        unsigned rdlo = (instr >> 12) & 0xf;
56208                        unsigned rdhi = (instr >> 16) & 0xf;
56209                        unsigned rn = instr & 0xf;
56210                        unsigned rm = (instr >> 8) & 0xf;
56211                        // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56212                        smlalbb(condition,
56213                                Register(rdlo),
56214                                Register(rdhi),
56215                                Register(rn),
56216                                Register(rm));
56217                        break;
56218                      }
56219                    }
56220                    break;
56221                  }
56222                  case 0x000000a0: {
56223                    // 0x010000a0
56224                    switch (instr & 0x00400000) {
56225                      case 0x00000000: {
56226                        // 0x010000a0
56227                        if (((instr & 0xf0000000) == 0xf0000000)) {
56228                          UnallocatedA32(instr);
56229                          return;
56230                        }
56231                        Condition condition((instr >> 28) & 0xf);
56232                        unsigned rd = (instr >> 16) & 0xf;
56233                        unsigned rn = instr & 0xf;
56234                        unsigned rm = (instr >> 8) & 0xf;
56235                        unsigned ra = (instr >> 12) & 0xf;
56236                        // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56237                        smlatb(condition,
56238                               Register(rd),
56239                               Register(rn),
56240                               Register(rm),
56241                               Register(ra));
56242                        break;
56243                      }
56244                      case 0x00400000: {
56245                        // 0x014000a0
56246                        if (((instr & 0xf0000000) == 0xf0000000)) {
56247                          UnallocatedA32(instr);
56248                          return;
56249                        }
56250                        Condition condition((instr >> 28) & 0xf);
56251                        unsigned rdlo = (instr >> 12) & 0xf;
56252                        unsigned rdhi = (instr >> 16) & 0xf;
56253                        unsigned rn = instr & 0xf;
56254                        unsigned rm = (instr >> 8) & 0xf;
56255                        // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56256                        smlaltb(condition,
56257                                Register(rdlo),
56258                                Register(rdhi),
56259                                Register(rn),
56260                                Register(rm));
56261                        break;
56262                      }
56263                    }
56264                    break;
56265                  }
56266                  case 0x000000c0: {
56267                    // 0x010000c0
56268                    switch (instr & 0x00400000) {
56269                      case 0x00000000: {
56270                        // 0x010000c0
56271                        if (((instr & 0xf0000000) == 0xf0000000)) {
56272                          UnallocatedA32(instr);
56273                          return;
56274                        }
56275                        Condition condition((instr >> 28) & 0xf);
56276                        unsigned rd = (instr >> 16) & 0xf;
56277                        unsigned rn = instr & 0xf;
56278                        unsigned rm = (instr >> 8) & 0xf;
56279                        unsigned ra = (instr >> 12) & 0xf;
56280                        // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56281                        smlabt(condition,
56282                               Register(rd),
56283                               Register(rn),
56284                               Register(rm),
56285                               Register(ra));
56286                        break;
56287                      }
56288                      case 0x00400000: {
56289                        // 0x014000c0
56290                        if (((instr & 0xf0000000) == 0xf0000000)) {
56291                          UnallocatedA32(instr);
56292                          return;
56293                        }
56294                        Condition condition((instr >> 28) & 0xf);
56295                        unsigned rdlo = (instr >> 12) & 0xf;
56296                        unsigned rdhi = (instr >> 16) & 0xf;
56297                        unsigned rn = instr & 0xf;
56298                        unsigned rm = (instr >> 8) & 0xf;
56299                        // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56300                        smlalbt(condition,
56301                                Register(rdlo),
56302                                Register(rdhi),
56303                                Register(rn),
56304                                Register(rm));
56305                        break;
56306                      }
56307                    }
56308                    break;
56309                  }
56310                  case 0x000000e0: {
56311                    // 0x010000e0
56312                    switch (instr & 0x00400000) {
56313                      case 0x00000000: {
56314                        // 0x010000e0
56315                        if (((instr & 0xf0000000) == 0xf0000000)) {
56316                          UnallocatedA32(instr);
56317                          return;
56318                        }
56319                        Condition condition((instr >> 28) & 0xf);
56320                        unsigned rd = (instr >> 16) & 0xf;
56321                        unsigned rn = instr & 0xf;
56322                        unsigned rm = (instr >> 8) & 0xf;
56323                        unsigned ra = (instr >> 12) & 0xf;
56324                        // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56325                        smlatt(condition,
56326                               Register(rd),
56327                               Register(rn),
56328                               Register(rm),
56329                               Register(ra));
56330                        break;
56331                      }
56332                      case 0x00400000: {
56333                        // 0x014000e0
56334                        if (((instr & 0xf0000000) == 0xf0000000)) {
56335                          UnallocatedA32(instr);
56336                          return;
56337                        }
56338                        Condition condition((instr >> 28) & 0xf);
56339                        unsigned rdlo = (instr >> 12) & 0xf;
56340                        unsigned rdhi = (instr >> 16) & 0xf;
56341                        unsigned rn = instr & 0xf;
56342                        unsigned rm = (instr >> 8) & 0xf;
56343                        // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56344                        smlaltt(condition,
56345                                Register(rdlo),
56346                                Register(rdhi),
56347                                Register(rn),
56348                                Register(rm));
56349                        break;
56350                      }
56351                    }
56352                    break;
56353                  }
56354                  default:
56355                    UnallocatedA32(instr);
56356                    break;
56357                }
56358                break;
56359              }
56360              case 0x01200000: {
56361                // 0x01200000
56362                switch (instr & 0x000000e0) {
56363                  case 0x00000000: {
56364                    // 0x01200000
56365                    switch (instr & 0x00000200) {
56366                      case 0x00000000: {
56367                        // 0x01200000
56368                        if (((instr & 0xf0000000) == 0xf0000000)) {
56369                          UnallocatedA32(instr);
56370                          return;
56371                        }
56372                        Condition condition((instr >> 28) & 0xf);
56373                        unsigned spec_reg =
56374                            ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
56375                        unsigned rn = instr & 0xf;
56376                        // MSR{<c>}{<q>} <spec_reg>, <Rn> ; A1
56377                        msr(condition,
56378                            MaskedSpecialRegister(spec_reg),
56379                            Register(rn));
56380                        if (((instr & 0xfb0fff0) != 0x120f000)) {
56381                          UnpredictableA32(instr);
56382                        }
56383                        break;
56384                      }
56385                      case 0x00000200: {
56386                        // 0x01200200
56387                        if (((instr & 0xf0000000) == 0xf0000000)) {
56388                          UnallocatedA32(instr);
56389                          return;
56390                        }
56391                        UnimplementedA32("MSR", instr);
56392                        break;
56393                      }
56394                    }
56395                    break;
56396                  }
56397                  case 0x00000020: {
56398                    // 0x01200020
56399                    if ((instr & 0x00400000) == 0x00000000) {
56400                      if (((instr & 0xf0000000) == 0xf0000000)) {
56401                        UnallocatedA32(instr);
56402                        return;
56403                      }
56404                      Condition condition((instr >> 28) & 0xf);
56405                      unsigned rm = instr & 0xf;
56406                      // BXJ{<c>}{<q>} <Rm> ; A1
56407                      bxj(condition, Register(rm));
56408                      if (((instr & 0xffffff0) != 0x12fff20)) {
56409                        UnpredictableA32(instr);
56410                      }
56411                    } else {
56412                      UnallocatedA32(instr);
56413                    }
56414                    break;
56415                  }
56416                  case 0x00000040: {
56417                    // 0x01200040
56418                    switch (instr & 0x00400200) {
56419                      case 0x00000000: {
56420                        // 0x01200040
56421                        if (((instr & 0xf0000000) == 0xf0000000)) {
56422                          UnallocatedA32(instr);
56423                          return;
56424                        }
56425                        unsigned rd = (instr >> 12) & 0xf;
56426                        unsigned rn = (instr >> 16) & 0xf;
56427                        unsigned rm = instr & 0xf;
56428                        // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; A1
56429                        crc32h(al, Register(rd), Register(rn), Register(rm));
56430                        if (((instr & 0xff00ff0) != 0x1200040)) {
56431                          UnpredictableA32(instr);
56432                        }
56433                        break;
56434                      }
56435                      case 0x00000200: {
56436                        // 0x01200240
56437                        if (((instr & 0xf0000000) == 0xf0000000)) {
56438                          UnallocatedA32(instr);
56439                          return;
56440                        }
56441                        unsigned rd = (instr >> 12) & 0xf;
56442                        unsigned rn = (instr >> 16) & 0xf;
56443                        unsigned rm = instr & 0xf;
56444                        // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; A1
56445                        crc32ch(al, Register(rd), Register(rn), Register(rm));
56446                        if (((instr & 0xff00ff0) != 0x1200240)) {
56447                          UnpredictableA32(instr);
56448                        }
56449                        break;
56450                      }
56451                      default:
56452                        UnallocatedA32(instr);
56453                        break;
56454                    }
56455                    break;
56456                  }
56457                  case 0x00000060: {
56458                    // 0x01200060
56459                    if ((instr & 0x00400000) == 0x00400000) {
56460                      if (((instr & 0xf0000000) == 0xf0000000)) {
56461                        UnallocatedA32(instr);
56462                        return;
56463                      }
56464                      UnimplementedA32("ERET", instr);
56465                    } else {
56466                      UnallocatedA32(instr);
56467                    }
56468                    break;
56469                  }
56470                  case 0x00000080: {
56471                    // 0x01200080
56472                    switch (instr & 0x00400000) {
56473                      case 0x00000000: {
56474                        // 0x01200080
56475                        if (((instr & 0xf0000000) == 0xf0000000)) {
56476                          UnallocatedA32(instr);
56477                          return;
56478                        }
56479                        Condition condition((instr >> 28) & 0xf);
56480                        unsigned rd = (instr >> 16) & 0xf;
56481                        unsigned rn = instr & 0xf;
56482                        unsigned rm = (instr >> 8) & 0xf;
56483                        unsigned ra = (instr >> 12) & 0xf;
56484                        // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56485                        smlawb(condition,
56486                               Register(rd),
56487                               Register(rn),
56488                               Register(rm),
56489                               Register(ra));
56490                        break;
56491                      }
56492                      case 0x00400000: {
56493                        // 0x01600080
56494                        if (((instr & 0xf0000000) == 0xf0000000)) {
56495                          UnallocatedA32(instr);
56496                          return;
56497                        }
56498                        Condition condition((instr >> 28) & 0xf);
56499                        unsigned rd = (instr >> 16) & 0xf;
56500                        unsigned rn = instr & 0xf;
56501                        unsigned rm = (instr >> 8) & 0xf;
56502                        // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56503                        smulbb(condition,
56504                               Register(rd),
56505                               Register(rn),
56506                               Register(rm));
56507                        if (((instr & 0xff0f0f0) != 0x1600080)) {
56508                          UnpredictableA32(instr);
56509                        }
56510                        break;
56511                      }
56512                    }
56513                    break;
56514                  }
56515                  case 0x000000a0: {
56516                    // 0x012000a0
56517                    switch (instr & 0x00400000) {
56518                      case 0x00000000: {
56519                        // 0x012000a0
56520                        if (((instr & 0xf0000000) == 0xf0000000)) {
56521                          UnallocatedA32(instr);
56522                          return;
56523                        }
56524                        Condition condition((instr >> 28) & 0xf);
56525                        unsigned rd = (instr >> 16) & 0xf;
56526                        unsigned rn = instr & 0xf;
56527                        unsigned rm = (instr >> 8) & 0xf;
56528                        // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56529                        smulwb(condition,
56530                               Register(rd),
56531                               Register(rn),
56532                               Register(rm));
56533                        if (((instr & 0xff0f0f0) != 0x12000a0)) {
56534                          UnpredictableA32(instr);
56535                        }
56536                        break;
56537                      }
56538                      case 0x00400000: {
56539                        // 0x016000a0
56540                        if (((instr & 0xf0000000) == 0xf0000000)) {
56541                          UnallocatedA32(instr);
56542                          return;
56543                        }
56544                        Condition condition((instr >> 28) & 0xf);
56545                        unsigned rd = (instr >> 16) & 0xf;
56546                        unsigned rn = instr & 0xf;
56547                        unsigned rm = (instr >> 8) & 0xf;
56548                        // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56549                        smultb(condition,
56550                               Register(rd),
56551                               Register(rn),
56552                               Register(rm));
56553                        if (((instr & 0xff0f0f0) != 0x16000a0)) {
56554                          UnpredictableA32(instr);
56555                        }
56556                        break;
56557                      }
56558                    }
56559                    break;
56560                  }
56561                  case 0x000000c0: {
56562                    // 0x012000c0
56563                    switch (instr & 0x00400000) {
56564                      case 0x00000000: {
56565                        // 0x012000c0
56566                        if (((instr & 0xf0000000) == 0xf0000000)) {
56567                          UnallocatedA32(instr);
56568                          return;
56569                        }
56570                        Condition condition((instr >> 28) & 0xf);
56571                        unsigned rd = (instr >> 16) & 0xf;
56572                        unsigned rn = instr & 0xf;
56573                        unsigned rm = (instr >> 8) & 0xf;
56574                        unsigned ra = (instr >> 12) & 0xf;
56575                        // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56576                        smlawt(condition,
56577                               Register(rd),
56578                               Register(rn),
56579                               Register(rm),
56580                               Register(ra));
56581                        break;
56582                      }
56583                      case 0x00400000: {
56584                        // 0x016000c0
56585                        if (((instr & 0xf0000000) == 0xf0000000)) {
56586                          UnallocatedA32(instr);
56587                          return;
56588                        }
56589                        Condition condition((instr >> 28) & 0xf);
56590                        unsigned rd = (instr >> 16) & 0xf;
56591                        unsigned rn = instr & 0xf;
56592                        unsigned rm = (instr >> 8) & 0xf;
56593                        // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56594                        smulbt(condition,
56595                               Register(rd),
56596                               Register(rn),
56597                               Register(rm));
56598                        if (((instr & 0xff0f0f0) != 0x16000c0)) {
56599                          UnpredictableA32(instr);
56600                        }
56601                        break;
56602                      }
56603                    }
56604                    break;
56605                  }
56606                  case 0x000000e0: {
56607                    // 0x012000e0
56608                    switch (instr & 0x00400000) {
56609                      case 0x00000000: {
56610                        // 0x012000e0
56611                        if (((instr & 0xf0000000) == 0xf0000000)) {
56612                          UnallocatedA32(instr);
56613                          return;
56614                        }
56615                        Condition condition((instr >> 28) & 0xf);
56616                        unsigned rd = (instr >> 16) & 0xf;
56617                        unsigned rn = instr & 0xf;
56618                        unsigned rm = (instr >> 8) & 0xf;
56619                        // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56620                        smulwt(condition,
56621                               Register(rd),
56622                               Register(rn),
56623                               Register(rm));
56624                        if (((instr & 0xff0f0f0) != 0x12000e0)) {
56625                          UnpredictableA32(instr);
56626                        }
56627                        break;
56628                      }
56629                      case 0x00400000: {
56630                        // 0x016000e0
56631                        if (((instr & 0xf0000000) == 0xf0000000)) {
56632                          UnallocatedA32(instr);
56633                          return;
56634                        }
56635                        Condition condition((instr >> 28) & 0xf);
56636                        unsigned rd = (instr >> 16) & 0xf;
56637                        unsigned rn = instr & 0xf;
56638                        unsigned rm = (instr >> 8) & 0xf;
56639                        // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
56640                        smultt(condition,
56641                               Register(rd),
56642                               Register(rn),
56643                               Register(rm));
56644                        if (((instr & 0xff0f0f0) != 0x16000e0)) {
56645                          UnpredictableA32(instr);
56646                        }
56647                        break;
56648                      }
56649                    }
56650                    break;
56651                  }
56652                }
56653                break;
56654              }
56655              case 0x01800000: {
56656                // 0x01800000
56657                switch (instr & 0x00400000) {
56658                  case 0x00000000: {
56659                    // 0x01800000
56660                    switch (instr & 0x00000fe0) {
56661                      case 0x00000060: {
56662                        // 0x01800060
56663                        if (((instr & 0xf0000000) == 0xf0000000)) {
56664                          UnallocatedA32(instr);
56665                          return;
56666                        }
56667                        Condition condition((instr >> 28) & 0xf);
56668                        unsigned rd = (instr >> 12) & 0xf;
56669                        unsigned rn = (instr >> 16) & 0xf;
56670                        unsigned rm = instr & 0xf;
56671                        // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56672                        orr(condition,
56673                            Best,
56674                            Register(rd),
56675                            Register(rn),
56676                            Operand(Register(rm), RRX));
56677                        break;
56678                      }
56679                      default: {
56680                        if (((instr & 0xf0000000) == 0xf0000000) ||
56681                            ((instr & 0xfe0) == 0x60)) {
56682                          UnallocatedA32(instr);
56683                          return;
56684                        }
56685                        Condition condition((instr >> 28) & 0xf);
56686                        unsigned rd = (instr >> 12) & 0xf;
56687                        unsigned rn = (instr >> 16) & 0xf;
56688                        unsigned rm = instr & 0xf;
56689                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56690                                                            (instr >> 7) &
56691                                                                0x1f);
56692                        // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56693                        orr(condition,
56694                            Best,
56695                            Register(rd),
56696                            Register(rn),
56697                            Operand(Register(rm),
56698                                    shift_operand.GetType(),
56699                                    shift_operand.GetAmount()));
56700                        break;
56701                      }
56702                    }
56703                    break;
56704                  }
56705                  case 0x00400000: {
56706                    // 0x01c00000
56707                    switch (instr & 0x00000fe0) {
56708                      case 0x00000060: {
56709                        // 0x01c00060
56710                        if (((instr & 0xf0000000) == 0xf0000000)) {
56711                          UnallocatedA32(instr);
56712                          return;
56713                        }
56714                        Condition condition((instr >> 28) & 0xf);
56715                        unsigned rd = (instr >> 12) & 0xf;
56716                        unsigned rn = (instr >> 16) & 0xf;
56717                        unsigned rm = instr & 0xf;
56718                        // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56719                        bic(condition,
56720                            Best,
56721                            Register(rd),
56722                            Register(rn),
56723                            Operand(Register(rm), RRX));
56724                        break;
56725                      }
56726                      default: {
56727                        if (((instr & 0xf0000000) == 0xf0000000) ||
56728                            ((instr & 0xfe0) == 0x60)) {
56729                          UnallocatedA32(instr);
56730                          return;
56731                        }
56732                        Condition condition((instr >> 28) & 0xf);
56733                        unsigned rd = (instr >> 12) & 0xf;
56734                        unsigned rn = (instr >> 16) & 0xf;
56735                        unsigned rm = instr & 0xf;
56736                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56737                                                            (instr >> 7) &
56738                                                                0x1f);
56739                        // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56740                        bic(condition,
56741                            Best,
56742                            Register(rd),
56743                            Register(rn),
56744                            Operand(Register(rm),
56745                                    shift_operand.GetType(),
56746                                    shift_operand.GetAmount()));
56747                        break;
56748                      }
56749                    }
56750                    break;
56751                  }
56752                }
56753                break;
56754              }
56755              case 0x01a00000: {
56756                // 0x01a00000
56757                switch (instr & 0x00400000) {
56758                  case 0x00000000: {
56759                    // 0x01a00000
56760                    switch (instr & 0x00000fe0) {
56761                      case 0x00000060: {
56762                        // 0x01a00060
56763                        if (((instr & 0xf0000000) == 0xf0000000)) {
56764                          UnallocatedA32(instr);
56765                          return;
56766                        }
56767                        if (((instr & 0xf0000000) != 0xf0000000)) {
56768                          Condition condition((instr >> 28) & 0xf);
56769                          unsigned rd = (instr >> 12) & 0xf;
56770                          unsigned rm = instr & 0xf;
56771                          // RRX{<c>}{<q>} {<Rd>}, <Rm> ; A1
56772                          rrx(condition, Register(rd), Register(rm));
56773                          if (((instr & 0xfff0ff0) != 0x1a00060)) {
56774                            UnpredictableA32(instr);
56775                          }
56776                          return;
56777                        }
56778                        Condition condition((instr >> 28) & 0xf);
56779                        unsigned rd = (instr >> 12) & 0xf;
56780                        unsigned rm = instr & 0xf;
56781                        // MOV{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
56782                        mov(condition,
56783                            Best,
56784                            Register(rd),
56785                            Operand(Register(rm), RRX));
56786                        if (((instr & 0xfff0ff0) != 0x1a00060)) {
56787                          UnpredictableA32(instr);
56788                        }
56789                        break;
56790                      }
56791                      default: {
56792                        if (((instr & 0xf0000000) == 0xf0000000) ||
56793                            ((instr & 0xfe0) == 0x60)) {
56794                          UnallocatedA32(instr);
56795                          return;
56796                        }
56797                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
56798                             Uint32(0x2)) &&
56799                            ((instr & 0xf0000000) != 0xf0000000)) {
56800                          Condition condition((instr >> 28) & 0xf);
56801                          unsigned rd = (instr >> 12) & 0xf;
56802                          unsigned rm = instr & 0xf;
56803                          uint32_t amount = (instr >> 7) & 0x1f;
56804                          if (amount == 0) amount = 32;
56805                          // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
56806                          asr(condition,
56807                              Best,
56808                              Register(rd),
56809                              Register(rm),
56810                              amount);
56811                          if (((instr & 0xfff0070) != 0x1a00040)) {
56812                            UnpredictableA32(instr);
56813                          }
56814                          return;
56815                        }
56816                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
56817                             Uint32(0x0)) &&
56818                            ((instr & 0xf0000000) != 0xf0000000) &&
56819                            ((instr & 0x00000f80) != 0x00000000)) {
56820                          Condition condition((instr >> 28) & 0xf);
56821                          unsigned rd = (instr >> 12) & 0xf;
56822                          unsigned rm = instr & 0xf;
56823                          uint32_t amount = (instr >> 7) & 0x1f;
56824                          // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
56825                          lsl(condition,
56826                              Best,
56827                              Register(rd),
56828                              Register(rm),
56829                              amount);
56830                          if (((instr & 0xfff0070) != 0x1a00000)) {
56831                            UnpredictableA32(instr);
56832                          }
56833                          return;
56834                        }
56835                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
56836                             Uint32(0x1)) &&
56837                            ((instr & 0xf0000000) != 0xf0000000)) {
56838                          Condition condition((instr >> 28) & 0xf);
56839                          unsigned rd = (instr >> 12) & 0xf;
56840                          unsigned rm = instr & 0xf;
56841                          uint32_t amount = (instr >> 7) & 0x1f;
56842                          if (amount == 0) amount = 32;
56843                          // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
56844                          lsr(condition,
56845                              Best,
56846                              Register(rd),
56847                              Register(rm),
56848                              amount);
56849                          if (((instr & 0xfff0070) != 0x1a00020)) {
56850                            UnpredictableA32(instr);
56851                          }
56852                          return;
56853                        }
56854                        if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
56855                             Uint32(0x3)) &&
56856                            ((instr & 0xf0000000) != 0xf0000000) &&
56857                            ((instr & 0x00000f80) != 0x00000000)) {
56858                          Condition condition((instr >> 28) & 0xf);
56859                          unsigned rd = (instr >> 12) & 0xf;
56860                          unsigned rm = instr & 0xf;
56861                          uint32_t amount = (instr >> 7) & 0x1f;
56862                          // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
56863                          ror(condition,
56864                              Best,
56865                              Register(rd),
56866                              Register(rm),
56867                              amount);
56868                          if (((instr & 0xfff0070) != 0x1a00060)) {
56869                            UnpredictableA32(instr);
56870                          }
56871                          return;
56872                        }
56873                        Condition condition((instr >> 28) & 0xf);
56874                        unsigned rd = (instr >> 12) & 0xf;
56875                        unsigned rm = instr & 0xf;
56876                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56877                                                            (instr >> 7) &
56878                                                                0x1f);
56879                        // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
56880                        mov(condition,
56881                            Best,
56882                            Register(rd),
56883                            Operand(Register(rm),
56884                                    shift_operand.GetType(),
56885                                    shift_operand.GetAmount()));
56886                        if (((instr & 0xfff0010) != 0x1a00000)) {
56887                          UnpredictableA32(instr);
56888                        }
56889                        break;
56890                      }
56891                    }
56892                    break;
56893                  }
56894                  case 0x00400000: {
56895                    // 0x01e00000
56896                    switch (instr & 0x00000fe0) {
56897                      case 0x00000060: {
56898                        // 0x01e00060
56899                        if (((instr & 0xf0000000) == 0xf0000000)) {
56900                          UnallocatedA32(instr);
56901                          return;
56902                        }
56903                        Condition condition((instr >> 28) & 0xf);
56904                        unsigned rd = (instr >> 12) & 0xf;
56905                        unsigned rm = instr & 0xf;
56906                        // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
56907                        mvn(condition,
56908                            Best,
56909                            Register(rd),
56910                            Operand(Register(rm), RRX));
56911                        if (((instr & 0xfff0ff0) != 0x1e00060)) {
56912                          UnpredictableA32(instr);
56913                        }
56914                        break;
56915                      }
56916                      default: {
56917                        if (((instr & 0xf0000000) == 0xf0000000) ||
56918                            ((instr & 0xfe0) == 0x60)) {
56919                          UnallocatedA32(instr);
56920                          return;
56921                        }
56922                        Condition condition((instr >> 28) & 0xf);
56923                        unsigned rd = (instr >> 12) & 0xf;
56924                        unsigned rm = instr & 0xf;
56925                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56926                                                            (instr >> 7) &
56927                                                                0x1f);
56928                        // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
56929                        mvn(condition,
56930                            Best,
56931                            Register(rd),
56932                            Operand(Register(rm),
56933                                    shift_operand.GetType(),
56934                                    shift_operand.GetAmount()));
56935                        if (((instr & 0xfff0010) != 0x1e00000)) {
56936                          UnpredictableA32(instr);
56937                        }
56938                        break;
56939                      }
56940                    }
56941                    break;
56942                  }
56943                }
56944                break;
56945              }
56946            }
56947            break;
56948          }
56949          case 0x00000010: {
56950            // 0x00000010
56951            switch (instr & 0x00400080) {
56952              case 0x00000000: {
56953                // 0x00000010
56954                switch (instr & 0x01a00000) {
56955                  case 0x00000000: {
56956                    // 0x00000010
56957                    if (((instr & 0xf0000000) == 0xf0000000)) {
56958                      UnallocatedA32(instr);
56959                      return;
56960                    }
56961                    Condition condition((instr >> 28) & 0xf);
56962                    unsigned rd = (instr >> 12) & 0xf;
56963                    unsigned rn = (instr >> 16) & 0xf;
56964                    unsigned rm = instr & 0xf;
56965                    Shift shift((instr >> 5) & 0x3);
56966                    unsigned rs = (instr >> 8) & 0xf;
56967                    // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
56968                    and_(condition,
56969                         Best,
56970                         Register(rd),
56971                         Register(rn),
56972                         Operand(Register(rm), shift.GetType(), Register(rs)));
56973                    break;
56974                  }
56975                  case 0x00200000: {
56976                    // 0x00200010
56977                    if (((instr & 0xf0000000) == 0xf0000000)) {
56978                      UnallocatedA32(instr);
56979                      return;
56980                    }
56981                    Condition condition((instr >> 28) & 0xf);
56982                    unsigned rd = (instr >> 12) & 0xf;
56983                    unsigned rn = (instr >> 16) & 0xf;
56984                    unsigned rm = instr & 0xf;
56985                    Shift shift((instr >> 5) & 0x3);
56986                    unsigned rs = (instr >> 8) & 0xf;
56987                    // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
56988                    eor(condition,
56989                        Best,
56990                        Register(rd),
56991                        Register(rn),
56992                        Operand(Register(rm), shift.GetType(), Register(rs)));
56993                    break;
56994                  }
56995                  case 0x00800000: {
56996                    // 0x00800010
56997                    if (((instr & 0xf0000000) == 0xf0000000)) {
56998                      UnallocatedA32(instr);
56999                      return;
57000                    }
57001                    Condition condition((instr >> 28) & 0xf);
57002                    unsigned rd = (instr >> 12) & 0xf;
57003                    unsigned rn = (instr >> 16) & 0xf;
57004                    unsigned rm = instr & 0xf;
57005                    Shift shift((instr >> 5) & 0x3);
57006                    unsigned rs = (instr >> 8) & 0xf;
57007                    // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57008                    add(condition,
57009                        Best,
57010                        Register(rd),
57011                        Register(rn),
57012                        Operand(Register(rm), shift.GetType(), Register(rs)));
57013                    break;
57014                  }
57015                  case 0x00a00000: {
57016                    // 0x00a00010
57017                    if (((instr & 0xf0000000) == 0xf0000000)) {
57018                      UnallocatedA32(instr);
57019                      return;
57020                    }
57021                    Condition condition((instr >> 28) & 0xf);
57022                    unsigned rd = (instr >> 12) & 0xf;
57023                    unsigned rn = (instr >> 16) & 0xf;
57024                    unsigned rm = instr & 0xf;
57025                    Shift shift((instr >> 5) & 0x3);
57026                    unsigned rs = (instr >> 8) & 0xf;
57027                    // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57028                    adc(condition,
57029                        Best,
57030                        Register(rd),
57031                        Register(rn),
57032                        Operand(Register(rm), shift.GetType(), Register(rs)));
57033                    break;
57034                  }
57035                  case 0x01000000: {
57036                    // 0x01000010
57037                    switch (instr & 0x00000060) {
57038                      case 0x00000040: {
57039                        // 0x01000050
57040                        if (((instr & 0xf0000000) == 0xf0000000)) {
57041                          UnallocatedA32(instr);
57042                          return;
57043                        }
57044                        Condition condition((instr >> 28) & 0xf);
57045                        unsigned rd = (instr >> 12) & 0xf;
57046                        unsigned rm = instr & 0xf;
57047                        unsigned rn = (instr >> 16) & 0xf;
57048                        // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57049                        qadd(condition,
57050                             Register(rd),
57051                             Register(rm),
57052                             Register(rn));
57053                        if (((instr & 0xff00ff0) != 0x1000050)) {
57054                          UnpredictableA32(instr);
57055                        }
57056                        break;
57057                      }
57058                      case 0x00000060: {
57059                        // 0x01000070
57060                        if (((instr & 0xf0000000) == 0xf0000000)) {
57061                          UnallocatedA32(instr);
57062                          return;
57063                        }
57064                        uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57065                        // HLT{<q>} {#}<imm> ; A1
57066                        hlt(al, imm);
57067                        break;
57068                      }
57069                      default:
57070                        UnallocatedA32(instr);
57071                        break;
57072                    }
57073                    break;
57074                  }
57075                  case 0x01200000: {
57076                    // 0x01200010
57077                    switch (instr & 0x00000060) {
57078                      case 0x00000000: {
57079                        // 0x01200010
57080                        if (((instr & 0xf0000000) == 0xf0000000)) {
57081                          UnallocatedA32(instr);
57082                          return;
57083                        }
57084                        Condition condition((instr >> 28) & 0xf);
57085                        unsigned rm = instr & 0xf;
57086                        // BX{<c>}{<q>} <Rm> ; A1
57087                        bx(condition, Register(rm));
57088                        if (((instr & 0xffffff0) != 0x12fff10)) {
57089                          UnpredictableA32(instr);
57090                        }
57091                        break;
57092                      }
57093                      case 0x00000020: {
57094                        // 0x01200030
57095                        if (((instr & 0xf0000000) == 0xf0000000)) {
57096                          UnallocatedA32(instr);
57097                          return;
57098                        }
57099                        Condition condition((instr >> 28) & 0xf);
57100                        unsigned rm = instr & 0xf;
57101                        // BLX{<c>}{<q>} <Rm> ; A1
57102                        blx(condition, Register(rm));
57103                        if (((instr & 0xffffff0) != 0x12fff30)) {
57104                          UnpredictableA32(instr);
57105                        }
57106                        break;
57107                      }
57108                      case 0x00000040: {
57109                        // 0x01200050
57110                        if (((instr & 0xf0000000) == 0xf0000000)) {
57111                          UnallocatedA32(instr);
57112                          return;
57113                        }
57114                        Condition condition((instr >> 28) & 0xf);
57115                        unsigned rd = (instr >> 12) & 0xf;
57116                        unsigned rm = instr & 0xf;
57117                        unsigned rn = (instr >> 16) & 0xf;
57118                        // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57119                        qsub(condition,
57120                             Register(rd),
57121                             Register(rm),
57122                             Register(rn));
57123                        if (((instr & 0xff00ff0) != 0x1200050)) {
57124                          UnpredictableA32(instr);
57125                        }
57126                        break;
57127                      }
57128                      case 0x00000060: {
57129                        // 0x01200070
57130                        if (((instr & 0xf0000000) == 0xf0000000)) {
57131                          UnallocatedA32(instr);
57132                          return;
57133                        }
57134                        uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57135                        // BKPT{<q>} {#}<imm> ; A1
57136                        bkpt(al, imm);
57137                        break;
57138                      }
57139                    }
57140                    break;
57141                  }
57142                  case 0x01800000: {
57143                    // 0x01800010
57144                    if (((instr & 0xf0000000) == 0xf0000000)) {
57145                      UnallocatedA32(instr);
57146                      return;
57147                    }
57148                    Condition condition((instr >> 28) & 0xf);
57149                    unsigned rd = (instr >> 12) & 0xf;
57150                    unsigned rn = (instr >> 16) & 0xf;
57151                    unsigned rm = instr & 0xf;
57152                    Shift shift((instr >> 5) & 0x3);
57153                    unsigned rs = (instr >> 8) & 0xf;
57154                    // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57155                    orr(condition,
57156                        Best,
57157                        Register(rd),
57158                        Register(rn),
57159                        Operand(Register(rm), shift.GetType(), Register(rs)));
57160                    break;
57161                  }
57162                  case 0x01a00000: {
57163                    // 0x01a00010
57164                    if (((instr & 0xf0000000) == 0xf0000000)) {
57165                      UnallocatedA32(instr);
57166                      return;
57167                    }
57168                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
57169                        ((instr & 0xf0000000) != 0xf0000000)) {
57170                      Condition condition((instr >> 28) & 0xf);
57171                      unsigned rd = (instr >> 12) & 0xf;
57172                      unsigned rm = instr & 0xf;
57173                      unsigned rs = (instr >> 8) & 0xf;
57174                      // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57175                      asr(condition,
57176                          Best,
57177                          Register(rd),
57178                          Register(rm),
57179                          Register(rs));
57180                      if (((instr & 0xfff00f0) != 0x1a00050)) {
57181                        UnpredictableA32(instr);
57182                      }
57183                      return;
57184                    }
57185                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
57186                        ((instr & 0xf0000000) != 0xf0000000)) {
57187                      Condition condition((instr >> 28) & 0xf);
57188                      unsigned rd = (instr >> 12) & 0xf;
57189                      unsigned rm = instr & 0xf;
57190                      unsigned rs = (instr >> 8) & 0xf;
57191                      // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57192                      lsl(condition,
57193                          Best,
57194                          Register(rd),
57195                          Register(rm),
57196                          Register(rs));
57197                      if (((instr & 0xfff00f0) != 0x1a00010)) {
57198                        UnpredictableA32(instr);
57199                      }
57200                      return;
57201                    }
57202                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
57203                        ((instr & 0xf0000000) != 0xf0000000)) {
57204                      Condition condition((instr >> 28) & 0xf);
57205                      unsigned rd = (instr >> 12) & 0xf;
57206                      unsigned rm = instr & 0xf;
57207                      unsigned rs = (instr >> 8) & 0xf;
57208                      // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57209                      lsr(condition,
57210                          Best,
57211                          Register(rd),
57212                          Register(rm),
57213                          Register(rs));
57214                      if (((instr & 0xfff00f0) != 0x1a00030)) {
57215                        UnpredictableA32(instr);
57216                      }
57217                      return;
57218                    }
57219                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
57220                        ((instr & 0xf0000000) != 0xf0000000)) {
57221                      Condition condition((instr >> 28) & 0xf);
57222                      unsigned rd = (instr >> 12) & 0xf;
57223                      unsigned rm = instr & 0xf;
57224                      unsigned rs = (instr >> 8) & 0xf;
57225                      // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57226                      ror(condition,
57227                          Best,
57228                          Register(rd),
57229                          Register(rm),
57230                          Register(rs));
57231                      if (((instr & 0xfff00f0) != 0x1a00070)) {
57232                        UnpredictableA32(instr);
57233                      }
57234                      return;
57235                    }
57236                    Condition condition((instr >> 28) & 0xf);
57237                    unsigned rd = (instr >> 12) & 0xf;
57238                    unsigned rm = instr & 0xf;
57239                    Shift shift((instr >> 5) & 0x3);
57240                    unsigned rs = (instr >> 8) & 0xf;
57241                    // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
57242                    mov(condition,
57243                        Best,
57244                        Register(rd),
57245                        Operand(Register(rm), shift.GetType(), Register(rs)));
57246                    if (((instr & 0xfff0090) != 0x1a00010)) {
57247                      UnpredictableA32(instr);
57248                    }
57249                    break;
57250                  }
57251                }
57252                break;
57253              }
57254              case 0x00000080: {
57255                // 0x00000090
57256                switch (instr & 0x01200060) {
57257                  case 0x00000000: {
57258                    // 0x00000090
57259                    switch (instr & 0x00800000) {
57260                      case 0x00000000: {
57261                        // 0x00000090
57262                        if (((instr & 0xf0000000) == 0xf0000000)) {
57263                          UnallocatedA32(instr);
57264                          return;
57265                        }
57266                        Condition condition((instr >> 28) & 0xf);
57267                        unsigned rd = (instr >> 16) & 0xf;
57268                        unsigned rn = instr & 0xf;
57269                        unsigned rm = (instr >> 8) & 0xf;
57270                        // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
57271                        mul(condition,
57272                            Best,
57273                            Register(rd),
57274                            Register(rn),
57275                            Register(rm));
57276                        if (((instr & 0xff0f0f0) != 0x90)) {
57277                          UnpredictableA32(instr);
57278                        }
57279                        break;
57280                      }
57281                      case 0x00800000: {
57282                        // 0x00800090
57283                        if (((instr & 0xf0000000) == 0xf0000000)) {
57284                          UnallocatedA32(instr);
57285                          return;
57286                        }
57287                        Condition condition((instr >> 28) & 0xf);
57288                        unsigned rdlo = (instr >> 12) & 0xf;
57289                        unsigned rdhi = (instr >> 16) & 0xf;
57290                        unsigned rn = instr & 0xf;
57291                        unsigned rm = (instr >> 8) & 0xf;
57292                        // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57293                        umull(condition,
57294                              Register(rdlo),
57295                              Register(rdhi),
57296                              Register(rn),
57297                              Register(rm));
57298                        break;
57299                      }
57300                    }
57301                    break;
57302                  }
57303                  case 0x00000020: {
57304                    // 0x000000b0
57305                    if (((instr & 0xf0000000) == 0xf0000000)) {
57306                      UnallocatedA32(instr);
57307                      return;
57308                    }
57309                    Condition condition((instr >> 28) & 0xf);
57310                    unsigned rt = (instr >> 12) & 0xf;
57311                    unsigned rn = (instr >> 16) & 0xf;
57312                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57313                    unsigned rm = instr & 0xf;
57314                    // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
57315                    strh(condition,
57316                         Best,
57317                         Register(rt),
57318                         MemOperand(Register(rn),
57319                                    sign,
57320                                    Register(rm),
57321                                    PostIndex));
57322                    if (((instr & 0xf700ff0) != 0xb0)) {
57323                      UnpredictableA32(instr);
57324                    }
57325                    break;
57326                  }
57327                  case 0x00000040: {
57328                    // 0x000000d0
57329                    if (((instr & 0xf0000000) == 0xf0000000)) {
57330                      UnallocatedA32(instr);
57331                      return;
57332                    }
57333                    Condition condition((instr >> 28) & 0xf);
57334                    unsigned rt = (instr >> 12) & 0xf;
57335                    unsigned rn = (instr >> 16) & 0xf;
57336                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57337                    unsigned rm = instr & 0xf;
57338                    // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
57339                    ldrd(condition,
57340                         Register(rt),
57341                         Register(rt + 1),
57342                         MemOperand(Register(rn),
57343                                    sign,
57344                                    Register(rm),
57345                                    PostIndex));
57346                    if (((instr & 0xf700ff0) != 0xd0)) {
57347                      UnpredictableA32(instr);
57348                    }
57349                    break;
57350                  }
57351                  case 0x00000060: {
57352                    // 0x000000f0
57353                    if (((instr & 0xf0000000) == 0xf0000000)) {
57354                      UnallocatedA32(instr);
57355                      return;
57356                    }
57357                    Condition condition((instr >> 28) & 0xf);
57358                    unsigned rt = (instr >> 12) & 0xf;
57359                    unsigned rn = (instr >> 16) & 0xf;
57360                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57361                    unsigned rm = instr & 0xf;
57362                    // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
57363                    strd(condition,
57364                         Register(rt),
57365                         Register(rt + 1),
57366                         MemOperand(Register(rn),
57367                                    sign,
57368                                    Register(rm),
57369                                    PostIndex));
57370                    if (((instr & 0xf700ff0) != 0xf0)) {
57371                      UnpredictableA32(instr);
57372                    }
57373                    break;
57374                  }
57375                  case 0x00200000: {
57376                    // 0x00200090
57377                    switch (instr & 0x00800000) {
57378                      case 0x00000000: {
57379                        // 0x00200090
57380                        if (((instr & 0xf0000000) == 0xf0000000)) {
57381                          UnallocatedA32(instr);
57382                          return;
57383                        }
57384                        Condition condition((instr >> 28) & 0xf);
57385                        unsigned rd = (instr >> 16) & 0xf;
57386                        unsigned rn = instr & 0xf;
57387                        unsigned rm = (instr >> 8) & 0xf;
57388                        unsigned ra = (instr >> 12) & 0xf;
57389                        // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
57390                        mla(condition,
57391                            Register(rd),
57392                            Register(rn),
57393                            Register(rm),
57394                            Register(ra));
57395                        break;
57396                      }
57397                      case 0x00800000: {
57398                        // 0x00a00090
57399                        if (((instr & 0xf0000000) == 0xf0000000)) {
57400                          UnallocatedA32(instr);
57401                          return;
57402                        }
57403                        Condition condition((instr >> 28) & 0xf);
57404                        unsigned rdlo = (instr >> 12) & 0xf;
57405                        unsigned rdhi = (instr >> 16) & 0xf;
57406                        unsigned rn = instr & 0xf;
57407                        unsigned rm = (instr >> 8) & 0xf;
57408                        // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57409                        umlal(condition,
57410                              Register(rdlo),
57411                              Register(rdhi),
57412                              Register(rn),
57413                              Register(rm));
57414                        break;
57415                      }
57416                    }
57417                    break;
57418                  }
57419                  case 0x00200020: {
57420                    // 0x002000b0
57421                    if (((instr & 0xf0000000) == 0xf0000000)) {
57422                      UnallocatedA32(instr);
57423                      return;
57424                    }
57425                    UnimplementedA32("STRHT", instr);
57426                    break;
57427                  }
57428                  case 0x01000000: {
57429                    // 0x01000090
57430                    switch (instr & 0x00800300) {
57431                      case 0x00800000: {
57432                        // 0x01800090
57433                        if (((instr & 0xf0000000) == 0xf0000000)) {
57434                          UnallocatedA32(instr);
57435                          return;
57436                        }
57437                        Condition condition((instr >> 28) & 0xf);
57438                        unsigned rt = instr & 0xf;
57439                        unsigned rn = (instr >> 16) & 0xf;
57440                        // STL{<c>}{<q>} <Rt>, [<Rn>] ; A1
57441                        stl(condition,
57442                            Register(rt),
57443                            MemOperand(Register(rn), Offset));
57444                        if (((instr & 0xff0fff0) != 0x180fc90)) {
57445                          UnpredictableA32(instr);
57446                        }
57447                        break;
57448                      }
57449                      case 0x00800200: {
57450                        // 0x01800290
57451                        if (((instr & 0xf0000000) == 0xf0000000)) {
57452                          UnallocatedA32(instr);
57453                          return;
57454                        }
57455                        Condition condition((instr >> 28) & 0xf);
57456                        unsigned rd = (instr >> 12) & 0xf;
57457                        unsigned rt = instr & 0xf;
57458                        unsigned rn = (instr >> 16) & 0xf;
57459                        // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
57460                        stlex(condition,
57461                              Register(rd),
57462                              Register(rt),
57463                              MemOperand(Register(rn), Offset));
57464                        if (((instr & 0xff00ff0) != 0x1800e90)) {
57465                          UnpredictableA32(instr);
57466                        }
57467                        break;
57468                      }
57469                      case 0x00800300: {
57470                        // 0x01800390
57471                        if (((instr & 0xf0000000) == 0xf0000000)) {
57472                          UnallocatedA32(instr);
57473                          return;
57474                        }
57475                        Condition condition((instr >> 28) & 0xf);
57476                        unsigned rd = (instr >> 12) & 0xf;
57477                        unsigned rt = instr & 0xf;
57478                        unsigned rn = (instr >> 16) & 0xf;
57479                        // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm_1>}] ; A1
57480                        strex(condition,
57481                              Register(rd),
57482                              Register(rt),
57483                              MemOperand(Register(rn), plus, 0, Offset));
57484                        if (((instr & 0xff00ff0) != 0x1800f90)) {
57485                          UnpredictableA32(instr);
57486                        }
57487                        break;
57488                      }
57489                      default:
57490                        UnallocatedA32(instr);
57491                        break;
57492                    }
57493                    break;
57494                  }
57495                  case 0x01000020: {
57496                    // 0x010000b0
57497                    if (((instr & 0xf0000000) == 0xf0000000)) {
57498                      UnallocatedA32(instr);
57499                      return;
57500                    }
57501                    Condition condition((instr >> 28) & 0xf);
57502                    unsigned rt = (instr >> 12) & 0xf;
57503                    unsigned rn = (instr >> 16) & 0xf;
57504                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57505                    unsigned rm = instr & 0xf;
57506                    AddrMode addrmode = Offset;
57507                    // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
57508                    strh(condition,
57509                         Best,
57510                         Register(rt),
57511                         MemOperand(Register(rn),
57512                                    sign,
57513                                    Register(rm),
57514                                    addrmode));
57515                    if (((instr & 0xf700ff0) != 0x10000b0)) {
57516                      UnpredictableA32(instr);
57517                    }
57518                    break;
57519                  }
57520                  case 0x01000040: {
57521                    // 0x010000d0
57522                    if (((instr & 0xf0000000) == 0xf0000000)) {
57523                      UnallocatedA32(instr);
57524                      return;
57525                    }
57526                    Condition condition((instr >> 28) & 0xf);
57527                    unsigned rt = (instr >> 12) & 0xf;
57528                    unsigned rn = (instr >> 16) & 0xf;
57529                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57530                    unsigned rm = instr & 0xf;
57531                    AddrMode addrmode = Offset;
57532                    // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
57533                    ldrd(condition,
57534                         Register(rt),
57535                         Register(rt + 1),
57536                         MemOperand(Register(rn),
57537                                    sign,
57538                                    Register(rm),
57539                                    addrmode));
57540                    if (((instr & 0xf700ff0) != 0x10000d0)) {
57541                      UnpredictableA32(instr);
57542                    }
57543                    break;
57544                  }
57545                  case 0x01000060: {
57546                    // 0x010000f0
57547                    if (((instr & 0xf0000000) == 0xf0000000)) {
57548                      UnallocatedA32(instr);
57549                      return;
57550                    }
57551                    Condition condition((instr >> 28) & 0xf);
57552                    unsigned rt = (instr >> 12) & 0xf;
57553                    unsigned rn = (instr >> 16) & 0xf;
57554                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57555                    unsigned rm = instr & 0xf;
57556                    AddrMode addrmode = Offset;
57557                    // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
57558                    strd(condition,
57559                         Register(rt),
57560                         Register(rt + 1),
57561                         MemOperand(Register(rn),
57562                                    sign,
57563                                    Register(rm),
57564                                    addrmode));
57565                    if (((instr & 0xf700ff0) != 0x10000f0)) {
57566                      UnpredictableA32(instr);
57567                    }
57568                    break;
57569                  }
57570                  case 0x01200000: {
57571                    // 0x01200090
57572                    switch (instr & 0x00800300) {
57573                      case 0x00800200: {
57574                        // 0x01a00290
57575                        if (((instr & 0xf0000000) == 0xf0000000)) {
57576                          UnallocatedA32(instr);
57577                          return;
57578                        }
57579                        Condition condition((instr >> 28) & 0xf);
57580                        unsigned rd = (instr >> 12) & 0xf;
57581                        unsigned rt = instr & 0xf;
57582                        unsigned rn = (instr >> 16) & 0xf;
57583                        // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
57584                        stlexd(condition,
57585                               Register(rd),
57586                               Register(rt),
57587                               Register(rt + 1),
57588                               MemOperand(Register(rn), Offset));
57589                        if (((instr & 0xff00ff0) != 0x1a00e90)) {
57590                          UnpredictableA32(instr);
57591                        }
57592                        break;
57593                      }
57594                      case 0x00800300: {
57595                        // 0x01a00390
57596                        if (((instr & 0xf0000000) == 0xf0000000)) {
57597                          UnallocatedA32(instr);
57598                          return;
57599                        }
57600                        Condition condition((instr >> 28) & 0xf);
57601                        unsigned rd = (instr >> 12) & 0xf;
57602                        unsigned rt = instr & 0xf;
57603                        unsigned rn = (instr >> 16) & 0xf;
57604                        // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
57605                        strexd(condition,
57606                               Register(rd),
57607                               Register(rt),
57608                               Register(rt + 1),
57609                               MemOperand(Register(rn), Offset));
57610                        if (((instr & 0xff00ff0) != 0x1a00f90)) {
57611                          UnpredictableA32(instr);
57612                        }
57613                        break;
57614                      }
57615                      default:
57616                        UnallocatedA32(instr);
57617                        break;
57618                    }
57619                    break;
57620                  }
57621                  case 0x01200020: {
57622                    // 0x012000b0
57623                    if (((instr & 0xf0000000) == 0xf0000000)) {
57624                      UnallocatedA32(instr);
57625                      return;
57626                    }
57627                    Condition condition((instr >> 28) & 0xf);
57628                    unsigned rt = (instr >> 12) & 0xf;
57629                    unsigned rn = (instr >> 16) & 0xf;
57630                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57631                    unsigned rm = instr & 0xf;
57632                    AddrMode addrmode = PreIndex;
57633                    // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
57634                    strh(condition,
57635                         Best,
57636                         Register(rt),
57637                         MemOperand(Register(rn),
57638                                    sign,
57639                                    Register(rm),
57640                                    addrmode));
57641                    if (((instr & 0xf700ff0) != 0x12000b0)) {
57642                      UnpredictableA32(instr);
57643                    }
57644                    break;
57645                  }
57646                  case 0x01200040: {
57647                    // 0x012000d0
57648                    if (((instr & 0xf0000000) == 0xf0000000)) {
57649                      UnallocatedA32(instr);
57650                      return;
57651                    }
57652                    Condition condition((instr >> 28) & 0xf);
57653                    unsigned rt = (instr >> 12) & 0xf;
57654                    unsigned rn = (instr >> 16) & 0xf;
57655                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57656                    unsigned rm = instr & 0xf;
57657                    AddrMode addrmode = PreIndex;
57658                    // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
57659                    ldrd(condition,
57660                         Register(rt),
57661                         Register(rt + 1),
57662                         MemOperand(Register(rn),
57663                                    sign,
57664                                    Register(rm),
57665                                    addrmode));
57666                    if (((instr & 0xf700ff0) != 0x12000d0)) {
57667                      UnpredictableA32(instr);
57668                    }
57669                    break;
57670                  }
57671                  case 0x01200060: {
57672                    // 0x012000f0
57673                    if (((instr & 0xf0000000) == 0xf0000000)) {
57674                      UnallocatedA32(instr);
57675                      return;
57676                    }
57677                    Condition condition((instr >> 28) & 0xf);
57678                    unsigned rt = (instr >> 12) & 0xf;
57679                    unsigned rn = (instr >> 16) & 0xf;
57680                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57681                    unsigned rm = instr & 0xf;
57682                    AddrMode addrmode = PreIndex;
57683                    // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
57684                    strd(condition,
57685                         Register(rt),
57686                         Register(rt + 1),
57687                         MemOperand(Register(rn),
57688                                    sign,
57689                                    Register(rm),
57690                                    addrmode));
57691                    if (((instr & 0xf700ff0) != 0x12000f0)) {
57692                      UnpredictableA32(instr);
57693                    }
57694                    break;
57695                  }
57696                  default:
57697                    UnallocatedA32(instr);
57698                    break;
57699                }
57700                break;
57701              }
57702              case 0x00400000: {
57703                // 0x00400010
57704                switch (instr & 0x01a00000) {
57705                  case 0x00000000: {
57706                    // 0x00400010
57707                    if (((instr & 0xf0000000) == 0xf0000000)) {
57708                      UnallocatedA32(instr);
57709                      return;
57710                    }
57711                    Condition condition((instr >> 28) & 0xf);
57712                    unsigned rd = (instr >> 12) & 0xf;
57713                    unsigned rn = (instr >> 16) & 0xf;
57714                    unsigned rm = instr & 0xf;
57715                    Shift shift((instr >> 5) & 0x3);
57716                    unsigned rs = (instr >> 8) & 0xf;
57717                    // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57718                    sub(condition,
57719                        Best,
57720                        Register(rd),
57721                        Register(rn),
57722                        Operand(Register(rm), shift.GetType(), Register(rs)));
57723                    break;
57724                  }
57725                  case 0x00200000: {
57726                    // 0x00600010
57727                    if (((instr & 0xf0000000) == 0xf0000000)) {
57728                      UnallocatedA32(instr);
57729                      return;
57730                    }
57731                    Condition condition((instr >> 28) & 0xf);
57732                    unsigned rd = (instr >> 12) & 0xf;
57733                    unsigned rn = (instr >> 16) & 0xf;
57734                    unsigned rm = instr & 0xf;
57735                    Shift shift((instr >> 5) & 0x3);
57736                    unsigned rs = (instr >> 8) & 0xf;
57737                    // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57738                    rsb(condition,
57739                        Best,
57740                        Register(rd),
57741                        Register(rn),
57742                        Operand(Register(rm), shift.GetType(), Register(rs)));
57743                    break;
57744                  }
57745                  case 0x00800000: {
57746                    // 0x00c00010
57747                    if (((instr & 0xf0000000) == 0xf0000000)) {
57748                      UnallocatedA32(instr);
57749                      return;
57750                    }
57751                    Condition condition((instr >> 28) & 0xf);
57752                    unsigned rd = (instr >> 12) & 0xf;
57753                    unsigned rn = (instr >> 16) & 0xf;
57754                    unsigned rm = instr & 0xf;
57755                    Shift shift((instr >> 5) & 0x3);
57756                    unsigned rs = (instr >> 8) & 0xf;
57757                    // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57758                    sbc(condition,
57759                        Best,
57760                        Register(rd),
57761                        Register(rn),
57762                        Operand(Register(rm), shift.GetType(), Register(rs)));
57763                    break;
57764                  }
57765                  case 0x00a00000: {
57766                    // 0x00e00010
57767                    if (((instr & 0xf0000000) == 0xf0000000)) {
57768                      UnallocatedA32(instr);
57769                      return;
57770                    }
57771                    Condition condition((instr >> 28) & 0xf);
57772                    unsigned rd = (instr >> 12) & 0xf;
57773                    unsigned rn = (instr >> 16) & 0xf;
57774                    unsigned rm = instr & 0xf;
57775                    Shift shift((instr >> 5) & 0x3);
57776                    unsigned rs = (instr >> 8) & 0xf;
57777                    // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57778                    rsc(condition,
57779                        Register(rd),
57780                        Register(rn),
57781                        Operand(Register(rm), shift.GetType(), Register(rs)));
57782                    break;
57783                  }
57784                  case 0x01000000: {
57785                    // 0x01400010
57786                    switch (instr & 0x00000060) {
57787                      case 0x00000040: {
57788                        // 0x01400050
57789                        if (((instr & 0xf0000000) == 0xf0000000)) {
57790                          UnallocatedA32(instr);
57791                          return;
57792                        }
57793                        Condition condition((instr >> 28) & 0xf);
57794                        unsigned rd = (instr >> 12) & 0xf;
57795                        unsigned rm = instr & 0xf;
57796                        unsigned rn = (instr >> 16) & 0xf;
57797                        // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57798                        qdadd(condition,
57799                              Register(rd),
57800                              Register(rm),
57801                              Register(rn));
57802                        if (((instr & 0xff00ff0) != 0x1400050)) {
57803                          UnpredictableA32(instr);
57804                        }
57805                        break;
57806                      }
57807                      case 0x00000060: {
57808                        // 0x01400070
57809                        if (((instr & 0xf0000000) == 0xf0000000)) {
57810                          UnallocatedA32(instr);
57811                          return;
57812                        }
57813                        uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57814                        // HVC{<q>} {#}<imm16> ; A1
57815                        hvc(al, imm);
57816                        break;
57817                      }
57818                      default:
57819                        UnallocatedA32(instr);
57820                        break;
57821                    }
57822                    break;
57823                  }
57824                  case 0x01200000: {
57825                    // 0x01600010
57826                    switch (instr & 0x00000060) {
57827                      case 0x00000000: {
57828                        // 0x01600010
57829                        if (((instr & 0xf0000000) == 0xf0000000)) {
57830                          UnallocatedA32(instr);
57831                          return;
57832                        }
57833                        Condition condition((instr >> 28) & 0xf);
57834                        unsigned rd = (instr >> 12) & 0xf;
57835                        unsigned rm = instr & 0xf;
57836                        // CLZ{<c>}{<q>} <Rd>, <Rm> ; A1
57837                        clz(condition, Register(rd), Register(rm));
57838                        if (((instr & 0xfff0ff0) != 0x16f0f10)) {
57839                          UnpredictableA32(instr);
57840                        }
57841                        break;
57842                      }
57843                      case 0x00000040: {
57844                        // 0x01600050
57845                        if (((instr & 0xf0000000) == 0xf0000000)) {
57846                          UnallocatedA32(instr);
57847                          return;
57848                        }
57849                        Condition condition((instr >> 28) & 0xf);
57850                        unsigned rd = (instr >> 12) & 0xf;
57851                        unsigned rm = instr & 0xf;
57852                        unsigned rn = (instr >> 16) & 0xf;
57853                        // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57854                        qdsub(condition,
57855                              Register(rd),
57856                              Register(rm),
57857                              Register(rn));
57858                        if (((instr & 0xff00ff0) != 0x1600050)) {
57859                          UnpredictableA32(instr);
57860                        }
57861                        break;
57862                      }
57863                      case 0x00000060: {
57864                        // 0x01600070
57865                        if (((instr & 0xf0000000) == 0xf0000000)) {
57866                          UnallocatedA32(instr);
57867                          return;
57868                        }
57869                        UnimplementedA32("SMC", instr);
57870                        break;
57871                      }
57872                      default:
57873                        UnallocatedA32(instr);
57874                        break;
57875                    }
57876                    break;
57877                  }
57878                  case 0x01800000: {
57879                    // 0x01c00010
57880                    if (((instr & 0xf0000000) == 0xf0000000)) {
57881                      UnallocatedA32(instr);
57882                      return;
57883                    }
57884                    Condition condition((instr >> 28) & 0xf);
57885                    unsigned rd = (instr >> 12) & 0xf;
57886                    unsigned rn = (instr >> 16) & 0xf;
57887                    unsigned rm = instr & 0xf;
57888                    Shift shift((instr >> 5) & 0x3);
57889                    unsigned rs = (instr >> 8) & 0xf;
57890                    // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57891                    bic(condition,
57892                        Best,
57893                        Register(rd),
57894                        Register(rn),
57895                        Operand(Register(rm), shift.GetType(), Register(rs)));
57896                    break;
57897                  }
57898                  case 0x01a00000: {
57899                    // 0x01e00010
57900                    if (((instr & 0xf0000000) == 0xf0000000)) {
57901                      UnallocatedA32(instr);
57902                      return;
57903                    }
57904                    Condition condition((instr >> 28) & 0xf);
57905                    unsigned rd = (instr >> 12) & 0xf;
57906                    unsigned rm = instr & 0xf;
57907                    Shift shift((instr >> 5) & 0x3);
57908                    unsigned rs = (instr >> 8) & 0xf;
57909                    // MVN{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
57910                    mvn(condition,
57911                        Best,
57912                        Register(rd),
57913                        Operand(Register(rm), shift.GetType(), Register(rs)));
57914                    if (((instr & 0xfff0090) != 0x1e00010)) {
57915                      UnpredictableA32(instr);
57916                    }
57917                    break;
57918                  }
57919                }
57920                break;
57921              }
57922              case 0x00400080: {
57923                // 0x00400090
57924                switch (instr & 0x00000060) {
57925                  case 0x00000000: {
57926                    // 0x00400090
57927                    switch (instr & 0x01a00000) {
57928                      case 0x00000000: {
57929                        // 0x00400090
57930                        if (((instr & 0xf0000000) == 0xf0000000)) {
57931                          UnallocatedA32(instr);
57932                          return;
57933                        }
57934                        Condition condition((instr >> 28) & 0xf);
57935                        unsigned rdlo = (instr >> 12) & 0xf;
57936                        unsigned rdhi = (instr >> 16) & 0xf;
57937                        unsigned rn = instr & 0xf;
57938                        unsigned rm = (instr >> 8) & 0xf;
57939                        // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57940                        umaal(condition,
57941                              Register(rdlo),
57942                              Register(rdhi),
57943                              Register(rn),
57944                              Register(rm));
57945                        break;
57946                      }
57947                      case 0x00200000: {
57948                        // 0x00600090
57949                        if (((instr & 0xf0000000) == 0xf0000000)) {
57950                          UnallocatedA32(instr);
57951                          return;
57952                        }
57953                        Condition condition((instr >> 28) & 0xf);
57954                        unsigned rd = (instr >> 16) & 0xf;
57955                        unsigned rn = instr & 0xf;
57956                        unsigned rm = (instr >> 8) & 0xf;
57957                        unsigned ra = (instr >> 12) & 0xf;
57958                        // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
57959                        mls(condition,
57960                            Register(rd),
57961                            Register(rn),
57962                            Register(rm),
57963                            Register(ra));
57964                        break;
57965                      }
57966                      case 0x00800000: {
57967                        // 0x00c00090
57968                        if (((instr & 0xf0000000) == 0xf0000000)) {
57969                          UnallocatedA32(instr);
57970                          return;
57971                        }
57972                        Condition condition((instr >> 28) & 0xf);
57973                        unsigned rdlo = (instr >> 12) & 0xf;
57974                        unsigned rdhi = (instr >> 16) & 0xf;
57975                        unsigned rn = instr & 0xf;
57976                        unsigned rm = (instr >> 8) & 0xf;
57977                        // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57978                        smull(condition,
57979                              Register(rdlo),
57980                              Register(rdhi),
57981                              Register(rn),
57982                              Register(rm));
57983                        break;
57984                      }
57985                      case 0x00a00000: {
57986                        // 0x00e00090
57987                        if (((instr & 0xf0000000) == 0xf0000000)) {
57988                          UnallocatedA32(instr);
57989                          return;
57990                        }
57991                        Condition condition((instr >> 28) & 0xf);
57992                        unsigned rdlo = (instr >> 12) & 0xf;
57993                        unsigned rdhi = (instr >> 16) & 0xf;
57994                        unsigned rn = instr & 0xf;
57995                        unsigned rm = (instr >> 8) & 0xf;
57996                        // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57997                        smlal(condition,
57998                              Register(rdlo),
57999                              Register(rdhi),
58000                              Register(rn),
58001                              Register(rm));
58002                        break;
58003                      }
58004                      case 0x01800000: {
58005                        // 0x01c00090
58006                        switch (instr & 0x00000300) {
58007                          case 0x00000000: {
58008                            // 0x01c00090
58009                            if (((instr & 0xf0000000) == 0xf0000000)) {
58010                              UnallocatedA32(instr);
58011                              return;
58012                            }
58013                            Condition condition((instr >> 28) & 0xf);
58014                            unsigned rt = instr & 0xf;
58015                            unsigned rn = (instr >> 16) & 0xf;
58016                            // STLB{<c>}{<q>} <Rt>, [<Rn>] ; A1
58017                            stlb(condition,
58018                                 Register(rt),
58019                                 MemOperand(Register(rn), Offset));
58020                            if (((instr & 0xff0fff0) != 0x1c0fc90)) {
58021                              UnpredictableA32(instr);
58022                            }
58023                            break;
58024                          }
58025                          case 0x00000200: {
58026                            // 0x01c00290
58027                            if (((instr & 0xf0000000) == 0xf0000000)) {
58028                              UnallocatedA32(instr);
58029                              return;
58030                            }
58031                            Condition condition((instr >> 28) & 0xf);
58032                            unsigned rd = (instr >> 12) & 0xf;
58033                            unsigned rt = instr & 0xf;
58034                            unsigned rn = (instr >> 16) & 0xf;
58035                            // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58036                            stlexb(condition,
58037                                   Register(rd),
58038                                   Register(rt),
58039                                   MemOperand(Register(rn), Offset));
58040                            if (((instr & 0xff00ff0) != 0x1c00e90)) {
58041                              UnpredictableA32(instr);
58042                            }
58043                            break;
58044                          }
58045                          case 0x00000300: {
58046                            // 0x01c00390
58047                            if (((instr & 0xf0000000) == 0xf0000000)) {
58048                              UnallocatedA32(instr);
58049                              return;
58050                            }
58051                            Condition condition((instr >> 28) & 0xf);
58052                            unsigned rd = (instr >> 12) & 0xf;
58053                            unsigned rt = instr & 0xf;
58054                            unsigned rn = (instr >> 16) & 0xf;
58055                            // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58056                            strexb(condition,
58057                                   Register(rd),
58058                                   Register(rt),
58059                                   MemOperand(Register(rn), Offset));
58060                            if (((instr & 0xff00ff0) != 0x1c00f90)) {
58061                              UnpredictableA32(instr);
58062                            }
58063                            break;
58064                          }
58065                          default:
58066                            UnallocatedA32(instr);
58067                            break;
58068                        }
58069                        break;
58070                      }
58071                      case 0x01a00000: {
58072                        // 0x01e00090
58073                        switch (instr & 0x00000300) {
58074                          case 0x00000000: {
58075                            // 0x01e00090
58076                            if (((instr & 0xf0000000) == 0xf0000000)) {
58077                              UnallocatedA32(instr);
58078                              return;
58079                            }
58080                            Condition condition((instr >> 28) & 0xf);
58081                            unsigned rt = instr & 0xf;
58082                            unsigned rn = (instr >> 16) & 0xf;
58083                            // STLH{<c>}{<q>} <Rt>, [<Rn>] ; A1
58084                            stlh(condition,
58085                                 Register(rt),
58086                                 MemOperand(Register(rn), Offset));
58087                            if (((instr & 0xff0fff0) != 0x1e0fc90)) {
58088                              UnpredictableA32(instr);
58089                            }
58090                            break;
58091                          }
58092                          case 0x00000200: {
58093                            // 0x01e00290
58094                            if (((instr & 0xf0000000) == 0xf0000000)) {
58095                              UnallocatedA32(instr);
58096                              return;
58097                            }
58098                            Condition condition((instr >> 28) & 0xf);
58099                            unsigned rd = (instr >> 12) & 0xf;
58100                            unsigned rt = instr & 0xf;
58101                            unsigned rn = (instr >> 16) & 0xf;
58102                            // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58103                            stlexh(condition,
58104                                   Register(rd),
58105                                   Register(rt),
58106                                   MemOperand(Register(rn), Offset));
58107                            if (((instr & 0xff00ff0) != 0x1e00e90)) {
58108                              UnpredictableA32(instr);
58109                            }
58110                            break;
58111                          }
58112                          case 0x00000300: {
58113                            // 0x01e00390
58114                            if (((instr & 0xf0000000) == 0xf0000000)) {
58115                              UnallocatedA32(instr);
58116                              return;
58117                            }
58118                            Condition condition((instr >> 28) & 0xf);
58119                            unsigned rd = (instr >> 12) & 0xf;
58120                            unsigned rt = instr & 0xf;
58121                            unsigned rn = (instr >> 16) & 0xf;
58122                            // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58123                            strexh(condition,
58124                                   Register(rd),
58125                                   Register(rt),
58126                                   MemOperand(Register(rn), Offset));
58127                            if (((instr & 0xff00ff0) != 0x1e00f90)) {
58128                              UnpredictableA32(instr);
58129                            }
58130                            break;
58131                          }
58132                          default:
58133                            UnallocatedA32(instr);
58134                            break;
58135                        }
58136                        break;
58137                      }
58138                      default:
58139                        UnallocatedA32(instr);
58140                        break;
58141                    }
58142                    break;
58143                  }
58144                  case 0x00000020: {
58145                    // 0x004000b0
58146                    switch (instr & 0x01200000) {
58147                      case 0x00000000: {
58148                        // 0x004000b0
58149                        if (((instr & 0xf0000000) == 0xf0000000)) {
58150                          UnallocatedA32(instr);
58151                          return;
58152                        }
58153                        Condition condition((instr >> 28) & 0xf);
58154                        unsigned rt = (instr >> 12) & 0xf;
58155                        unsigned rn = (instr >> 16) & 0xf;
58156                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58157                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58158                        // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
58159                        strh(condition,
58160                             Best,
58161                             Register(rt),
58162                             MemOperand(Register(rn), sign, offset, PostIndex));
58163                        break;
58164                      }
58165                      case 0x00200000: {
58166                        // 0x006000b0
58167                        if (((instr & 0xf0000000) == 0xf0000000)) {
58168                          UnallocatedA32(instr);
58169                          return;
58170                        }
58171                        UnimplementedA32("STRHT", instr);
58172                        break;
58173                      }
58174                      case 0x01000000: {
58175                        // 0x014000b0
58176                        if (((instr & 0xf0000000) == 0xf0000000)) {
58177                          UnallocatedA32(instr);
58178                          return;
58179                        }
58180                        Condition condition((instr >> 28) & 0xf);
58181                        unsigned rt = (instr >> 12) & 0xf;
58182                        unsigned rn = (instr >> 16) & 0xf;
58183                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58184                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58185                        // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
58186                        strh(condition,
58187                             Best,
58188                             Register(rt),
58189                             MemOperand(Register(rn), sign, offset, Offset));
58190                        break;
58191                      }
58192                      case 0x01200000: {
58193                        // 0x016000b0
58194                        if (((instr & 0xf0000000) == 0xf0000000)) {
58195                          UnallocatedA32(instr);
58196                          return;
58197                        }
58198                        Condition condition((instr >> 28) & 0xf);
58199                        unsigned rt = (instr >> 12) & 0xf;
58200                        unsigned rn = (instr >> 16) & 0xf;
58201                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58202                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58203                        // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
58204                        strh(condition,
58205                             Best,
58206                             Register(rt),
58207                             MemOperand(Register(rn), sign, offset, PreIndex));
58208                        break;
58209                      }
58210                    }
58211                    break;
58212                  }
58213                  case 0x00000040: {
58214                    // 0x004000d0
58215                    switch (instr & 0x000f0000) {
58216                      case 0x000f0000: {
58217                        // 0x004f00d0
58218                        if (((instr & 0xf0000000) == 0xf0000000)) {
58219                          UnallocatedA32(instr);
58220                          return;
58221                        }
58222                        Condition condition((instr >> 28) & 0xf);
58223                        unsigned rt = (instr >> 12) & 0xf;
58224                        uint32_t U = (instr >> 23) & 0x1;
58225                        int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
58226                        if (U == 0) imm = -imm;
58227                        bool minus_zero = (imm == 0) && (U == 0);
58228                        Location location(imm, kA32PcDelta);
58229                        // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; A1
58230                        if (minus_zero) {
58231                          ldrd(condition,
58232                               Register(rt),
58233                               Register(rt + 1),
58234                               MemOperand(pc, minus, 0));
58235                        } else {
58236                          ldrd(condition,
58237                               Register(rt),
58238                               Register(rt + 1),
58239                               &location);
58240                        }
58241                        if (((instr & 0xf7f00f0) != 0x14f00d0)) {
58242                          UnpredictableA32(instr);
58243                        }
58244                        break;
58245                      }
58246                      default: {
58247                        switch (instr & 0x01200000) {
58248                          case 0x00000000: {
58249                            // 0x004000d0
58250                            if (((instr & 0xf0000000) == 0xf0000000) ||
58251                                ((instr & 0xf0000) == 0xf0000)) {
58252                              UnallocatedA32(instr);
58253                              return;
58254                            }
58255                            Condition condition((instr >> 28) & 0xf);
58256                            unsigned rt = (instr >> 12) & 0xf;
58257                            unsigned rn = (instr >> 16) & 0xf;
58258                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58259                                                                   : plus);
58260                            int32_t offset =
58261                                (instr & 0xf) | ((instr >> 4) & 0xf0);
58262                            // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
58263                            ldrd(condition,
58264                                 Register(rt),
58265                                 Register(rt + 1),
58266                                 MemOperand(Register(rn),
58267                                            sign,
58268                                            offset,
58269                                            PostIndex));
58270                            break;
58271                          }
58272                          case 0x01000000: {
58273                            // 0x014000d0
58274                            if (((instr & 0xf0000000) == 0xf0000000) ||
58275                                ((instr & 0xf0000) == 0xf0000)) {
58276                              UnallocatedA32(instr);
58277                              return;
58278                            }
58279                            Condition condition((instr >> 28) & 0xf);
58280                            unsigned rt = (instr >> 12) & 0xf;
58281                            unsigned rn = (instr >> 16) & 0xf;
58282                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58283                                                                   : plus);
58284                            int32_t offset =
58285                                (instr & 0xf) | ((instr >> 4) & 0xf0);
58286                            // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
58287                            ldrd(condition,
58288                                 Register(rt),
58289                                 Register(rt + 1),
58290                                 MemOperand(Register(rn),
58291                                            sign,
58292                                            offset,
58293                                            Offset));
58294                            break;
58295                          }
58296                          case 0x01200000: {
58297                            // 0x016000d0
58298                            if (((instr & 0xf0000000) == 0xf0000000) ||
58299                                ((instr & 0xf0000) == 0xf0000)) {
58300                              UnallocatedA32(instr);
58301                              return;
58302                            }
58303                            Condition condition((instr >> 28) & 0xf);
58304                            unsigned rt = (instr >> 12) & 0xf;
58305                            unsigned rn = (instr >> 16) & 0xf;
58306                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58307                                                                   : plus);
58308                            int32_t offset =
58309                                (instr & 0xf) | ((instr >> 4) & 0xf0);
58310                            // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
58311                            ldrd(condition,
58312                                 Register(rt),
58313                                 Register(rt + 1),
58314                                 MemOperand(Register(rn),
58315                                            sign,
58316                                            offset,
58317                                            PreIndex));
58318                            break;
58319                          }
58320                          default:
58321                            UnallocatedA32(instr);
58322                            break;
58323                        }
58324                        break;
58325                      }
58326                    }
58327                    break;
58328                  }
58329                  case 0x00000060: {
58330                    // 0x004000f0
58331                    switch (instr & 0x01200000) {
58332                      case 0x00000000: {
58333                        // 0x004000f0
58334                        if (((instr & 0xf0000000) == 0xf0000000)) {
58335                          UnallocatedA32(instr);
58336                          return;
58337                        }
58338                        Condition condition((instr >> 28) & 0xf);
58339                        unsigned rt = (instr >> 12) & 0xf;
58340                        unsigned rn = (instr >> 16) & 0xf;
58341                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58342                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58343                        // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
58344                        strd(condition,
58345                             Register(rt),
58346                             Register(rt + 1),
58347                             MemOperand(Register(rn), sign, offset, PostIndex));
58348                        break;
58349                      }
58350                      case 0x01000000: {
58351                        // 0x014000f0
58352                        if (((instr & 0xf0000000) == 0xf0000000)) {
58353                          UnallocatedA32(instr);
58354                          return;
58355                        }
58356                        Condition condition((instr >> 28) & 0xf);
58357                        unsigned rt = (instr >> 12) & 0xf;
58358                        unsigned rn = (instr >> 16) & 0xf;
58359                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58360                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58361                        // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
58362                        strd(condition,
58363                             Register(rt),
58364                             Register(rt + 1),
58365                             MemOperand(Register(rn), sign, offset, Offset));
58366                        break;
58367                      }
58368                      case 0x01200000: {
58369                        // 0x016000f0
58370                        if (((instr & 0xf0000000) == 0xf0000000)) {
58371                          UnallocatedA32(instr);
58372                          return;
58373                        }
58374                        Condition condition((instr >> 28) & 0xf);
58375                        unsigned rt = (instr >> 12) & 0xf;
58376                        unsigned rn = (instr >> 16) & 0xf;
58377                        Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58378                        int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58379                        // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
58380                        strd(condition,
58381                             Register(rt),
58382                             Register(rt + 1),
58383                             MemOperand(Register(rn), sign, offset, PreIndex));
58384                        break;
58385                      }
58386                      default:
58387                        UnallocatedA32(instr);
58388                        break;
58389                    }
58390                    break;
58391                  }
58392                }
58393                break;
58394              }
58395            }
58396            break;
58397          }
58398          case 0x00100000: {
58399            // 0x00100000
58400            switch (instr & 0x01e00000) {
58401              case 0x00000000: {
58402                // 0x00100000
58403                switch (instr & 0x00000fe0) {
58404                  case 0x00000060: {
58405                    // 0x00100060
58406                    if (((instr & 0xf0000000) == 0xf0000000)) {
58407                      UnallocatedA32(instr);
58408                      return;
58409                    }
58410                    Condition condition((instr >> 28) & 0xf);
58411                    unsigned rd = (instr >> 12) & 0xf;
58412                    unsigned rn = (instr >> 16) & 0xf;
58413                    unsigned rm = instr & 0xf;
58414                    // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58415                    ands(condition,
58416                         Best,
58417                         Register(rd),
58418                         Register(rn),
58419                         Operand(Register(rm), RRX));
58420                    break;
58421                  }
58422                  default: {
58423                    if (((instr & 0xf0000000) == 0xf0000000) ||
58424                        ((instr & 0xfe0) == 0x60)) {
58425                      UnallocatedA32(instr);
58426                      return;
58427                    }
58428                    Condition condition((instr >> 28) & 0xf);
58429                    unsigned rd = (instr >> 12) & 0xf;
58430                    unsigned rn = (instr >> 16) & 0xf;
58431                    unsigned rm = instr & 0xf;
58432                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58433                                                        (instr >> 7) & 0x1f);
58434                    // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58435                    ands(condition,
58436                         Best,
58437                         Register(rd),
58438                         Register(rn),
58439                         Operand(Register(rm),
58440                                 shift_operand.GetType(),
58441                                 shift_operand.GetAmount()));
58442                    break;
58443                  }
58444                }
58445                break;
58446              }
58447              case 0x00200000: {
58448                // 0x00300000
58449                switch (instr & 0x00000fe0) {
58450                  case 0x00000060: {
58451                    // 0x00300060
58452                    if (((instr & 0xf0000000) == 0xf0000000)) {
58453                      UnallocatedA32(instr);
58454                      return;
58455                    }
58456                    Condition condition((instr >> 28) & 0xf);
58457                    unsigned rd = (instr >> 12) & 0xf;
58458                    unsigned rn = (instr >> 16) & 0xf;
58459                    unsigned rm = instr & 0xf;
58460                    // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58461                    eors(condition,
58462                         Best,
58463                         Register(rd),
58464                         Register(rn),
58465                         Operand(Register(rm), RRX));
58466                    break;
58467                  }
58468                  default: {
58469                    if (((instr & 0xf0000000) == 0xf0000000) ||
58470                        ((instr & 0xfe0) == 0x60)) {
58471                      UnallocatedA32(instr);
58472                      return;
58473                    }
58474                    Condition condition((instr >> 28) & 0xf);
58475                    unsigned rd = (instr >> 12) & 0xf;
58476                    unsigned rn = (instr >> 16) & 0xf;
58477                    unsigned rm = instr & 0xf;
58478                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58479                                                        (instr >> 7) & 0x1f);
58480                    // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58481                    eors(condition,
58482                         Best,
58483                         Register(rd),
58484                         Register(rn),
58485                         Operand(Register(rm),
58486                                 shift_operand.GetType(),
58487                                 shift_operand.GetAmount()));
58488                    break;
58489                  }
58490                }
58491                break;
58492              }
58493              case 0x00400000: {
58494                // 0x00500000
58495                switch (instr & 0x000f0000) {
58496                  case 0x000d0000: {
58497                    // 0x005d0000
58498                    switch (instr & 0x00000fe0) {
58499                      case 0x00000060: {
58500                        // 0x005d0060
58501                        if (((instr & 0xf0000000) == 0xf0000000)) {
58502                          UnallocatedA32(instr);
58503                          return;
58504                        }
58505                        Condition condition((instr >> 28) & 0xf);
58506                        unsigned rd = (instr >> 12) & 0xf;
58507                        unsigned rm = instr & 0xf;
58508                        // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
58509                        subs(condition,
58510                             Best,
58511                             Register(rd),
58512                             sp,
58513                             Operand(Register(rm), RRX));
58514                        break;
58515                      }
58516                      default: {
58517                        if (((instr & 0xf0000000) == 0xf0000000) ||
58518                            ((instr & 0xfe0) == 0x60)) {
58519                          UnallocatedA32(instr);
58520                          return;
58521                        }
58522                        Condition condition((instr >> 28) & 0xf);
58523                        unsigned rd = (instr >> 12) & 0xf;
58524                        unsigned rm = instr & 0xf;
58525                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58526                                                            (instr >> 7) &
58527                                                                0x1f);
58528                        // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58529                        subs(condition,
58530                             Best,
58531                             Register(rd),
58532                             sp,
58533                             Operand(Register(rm),
58534                                     shift_operand.GetType(),
58535                                     shift_operand.GetAmount()));
58536                        break;
58537                      }
58538                    }
58539                    break;
58540                  }
58541                  default: {
58542                    switch (instr & 0x00000fe0) {
58543                      case 0x00000060: {
58544                        // 0x00500060
58545                        if (((instr & 0xf0000000) == 0xf0000000) ||
58546                            ((instr & 0xf0000) == 0xd0000)) {
58547                          UnallocatedA32(instr);
58548                          return;
58549                        }
58550                        Condition condition((instr >> 28) & 0xf);
58551                        unsigned rd = (instr >> 12) & 0xf;
58552                        unsigned rn = (instr >> 16) & 0xf;
58553                        unsigned rm = instr & 0xf;
58554                        // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58555                        subs(condition,
58556                             Best,
58557                             Register(rd),
58558                             Register(rn),
58559                             Operand(Register(rm), RRX));
58560                        break;
58561                      }
58562                      default: {
58563                        if (((instr & 0xf0000000) == 0xf0000000) ||
58564                            ((instr & 0xf0000) == 0xd0000) ||
58565                            ((instr & 0xfe0) == 0x60)) {
58566                          UnallocatedA32(instr);
58567                          return;
58568                        }
58569                        Condition condition((instr >> 28) & 0xf);
58570                        unsigned rd = (instr >> 12) & 0xf;
58571                        unsigned rn = (instr >> 16) & 0xf;
58572                        unsigned rm = instr & 0xf;
58573                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58574                                                            (instr >> 7) &
58575                                                                0x1f);
58576                        // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58577                        subs(condition,
58578                             Best,
58579                             Register(rd),
58580                             Register(rn),
58581                             Operand(Register(rm),
58582                                     shift_operand.GetType(),
58583                                     shift_operand.GetAmount()));
58584                        break;
58585                      }
58586                    }
58587                    break;
58588                  }
58589                }
58590                break;
58591              }
58592              case 0x00600000: {
58593                // 0x00700000
58594                switch (instr & 0x00000fe0) {
58595                  case 0x00000060: {
58596                    // 0x00700060
58597                    if (((instr & 0xf0000000) == 0xf0000000)) {
58598                      UnallocatedA32(instr);
58599                      return;
58600                    }
58601                    Condition condition((instr >> 28) & 0xf);
58602                    unsigned rd = (instr >> 12) & 0xf;
58603                    unsigned rn = (instr >> 16) & 0xf;
58604                    unsigned rm = instr & 0xf;
58605                    // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58606                    rsbs(condition,
58607                         Best,
58608                         Register(rd),
58609                         Register(rn),
58610                         Operand(Register(rm), RRX));
58611                    break;
58612                  }
58613                  default: {
58614                    if (((instr & 0xf0000000) == 0xf0000000) ||
58615                        ((instr & 0xfe0) == 0x60)) {
58616                      UnallocatedA32(instr);
58617                      return;
58618                    }
58619                    Condition condition((instr >> 28) & 0xf);
58620                    unsigned rd = (instr >> 12) & 0xf;
58621                    unsigned rn = (instr >> 16) & 0xf;
58622                    unsigned rm = instr & 0xf;
58623                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58624                                                        (instr >> 7) & 0x1f);
58625                    // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58626                    rsbs(condition,
58627                         Best,
58628                         Register(rd),
58629                         Register(rn),
58630                         Operand(Register(rm),
58631                                 shift_operand.GetType(),
58632                                 shift_operand.GetAmount()));
58633                    break;
58634                  }
58635                }
58636                break;
58637              }
58638              case 0x00800000: {
58639                // 0x00900000
58640                switch (instr & 0x000f0000) {
58641                  case 0x000d0000: {
58642                    // 0x009d0000
58643                    switch (instr & 0x00000fe0) {
58644                      case 0x00000060: {
58645                        // 0x009d0060
58646                        if (((instr & 0xf0000000) == 0xf0000000)) {
58647                          UnallocatedA32(instr);
58648                          return;
58649                        }
58650                        Condition condition((instr >> 28) & 0xf);
58651                        unsigned rd = (instr >> 12) & 0xf;
58652                        unsigned rm = instr & 0xf;
58653                        // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
58654                        adds(condition,
58655                             Best,
58656                             Register(rd),
58657                             sp,
58658                             Operand(Register(rm), RRX));
58659                        break;
58660                      }
58661                      default: {
58662                        if (((instr & 0xf0000000) == 0xf0000000) ||
58663                            ((instr & 0xfe0) == 0x60)) {
58664                          UnallocatedA32(instr);
58665                          return;
58666                        }
58667                        Condition condition((instr >> 28) & 0xf);
58668                        unsigned rd = (instr >> 12) & 0xf;
58669                        unsigned rm = instr & 0xf;
58670                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58671                                                            (instr >> 7) &
58672                                                                0x1f);
58673                        // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58674                        adds(condition,
58675                             Best,
58676                             Register(rd),
58677                             sp,
58678                             Operand(Register(rm),
58679                                     shift_operand.GetType(),
58680                                     shift_operand.GetAmount()));
58681                        break;
58682                      }
58683                    }
58684                    break;
58685                  }
58686                  default: {
58687                    switch (instr & 0x00000fe0) {
58688                      case 0x00000060: {
58689                        // 0x00900060
58690                        if (((instr & 0xf0000000) == 0xf0000000) ||
58691                            ((instr & 0xf0000) == 0xd0000)) {
58692                          UnallocatedA32(instr);
58693                          return;
58694                        }
58695                        Condition condition((instr >> 28) & 0xf);
58696                        unsigned rd = (instr >> 12) & 0xf;
58697                        unsigned rn = (instr >> 16) & 0xf;
58698                        unsigned rm = instr & 0xf;
58699                        // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58700                        adds(condition,
58701                             Best,
58702                             Register(rd),
58703                             Register(rn),
58704                             Operand(Register(rm), RRX));
58705                        break;
58706                      }
58707                      default: {
58708                        if (((instr & 0xf0000000) == 0xf0000000) ||
58709                            ((instr & 0xf0000) == 0xd0000) ||
58710                            ((instr & 0xfe0) == 0x60)) {
58711                          UnallocatedA32(instr);
58712                          return;
58713                        }
58714                        Condition condition((instr >> 28) & 0xf);
58715                        unsigned rd = (instr >> 12) & 0xf;
58716                        unsigned rn = (instr >> 16) & 0xf;
58717                        unsigned rm = instr & 0xf;
58718                        ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58719                                                            (instr >> 7) &
58720                                                                0x1f);
58721                        // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58722                        adds(condition,
58723                             Best,
58724                             Register(rd),
58725                             Register(rn),
58726                             Operand(Register(rm),
58727                                     shift_operand.GetType(),
58728                                     shift_operand.GetAmount()));
58729                        break;
58730                      }
58731                    }
58732                    break;
58733                  }
58734                }
58735                break;
58736              }
58737              case 0x00a00000: {
58738                // 0x00b00000
58739                switch (instr & 0x00000fe0) {
58740                  case 0x00000060: {
58741                    // 0x00b00060
58742                    if (((instr & 0xf0000000) == 0xf0000000)) {
58743                      UnallocatedA32(instr);
58744                      return;
58745                    }
58746                    Condition condition((instr >> 28) & 0xf);
58747                    unsigned rd = (instr >> 12) & 0xf;
58748                    unsigned rn = (instr >> 16) & 0xf;
58749                    unsigned rm = instr & 0xf;
58750                    // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58751                    adcs(condition,
58752                         Best,
58753                         Register(rd),
58754                         Register(rn),
58755                         Operand(Register(rm), RRX));
58756                    break;
58757                  }
58758                  default: {
58759                    if (((instr & 0xf0000000) == 0xf0000000) ||
58760                        ((instr & 0xfe0) == 0x60)) {
58761                      UnallocatedA32(instr);
58762                      return;
58763                    }
58764                    Condition condition((instr >> 28) & 0xf);
58765                    unsigned rd = (instr >> 12) & 0xf;
58766                    unsigned rn = (instr >> 16) & 0xf;
58767                    unsigned rm = instr & 0xf;
58768                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58769                                                        (instr >> 7) & 0x1f);
58770                    // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58771                    adcs(condition,
58772                         Best,
58773                         Register(rd),
58774                         Register(rn),
58775                         Operand(Register(rm),
58776                                 shift_operand.GetType(),
58777                                 shift_operand.GetAmount()));
58778                    break;
58779                  }
58780                }
58781                break;
58782              }
58783              case 0x00c00000: {
58784                // 0x00d00000
58785                switch (instr & 0x00000fe0) {
58786                  case 0x00000060: {
58787                    // 0x00d00060
58788                    if (((instr & 0xf0000000) == 0xf0000000)) {
58789                      UnallocatedA32(instr);
58790                      return;
58791                    }
58792                    Condition condition((instr >> 28) & 0xf);
58793                    unsigned rd = (instr >> 12) & 0xf;
58794                    unsigned rn = (instr >> 16) & 0xf;
58795                    unsigned rm = instr & 0xf;
58796                    // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58797                    sbcs(condition,
58798                         Best,
58799                         Register(rd),
58800                         Register(rn),
58801                         Operand(Register(rm), RRX));
58802                    break;
58803                  }
58804                  default: {
58805                    if (((instr & 0xf0000000) == 0xf0000000) ||
58806                        ((instr & 0xfe0) == 0x60)) {
58807                      UnallocatedA32(instr);
58808                      return;
58809                    }
58810                    Condition condition((instr >> 28) & 0xf);
58811                    unsigned rd = (instr >> 12) & 0xf;
58812                    unsigned rn = (instr >> 16) & 0xf;
58813                    unsigned rm = instr & 0xf;
58814                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58815                                                        (instr >> 7) & 0x1f);
58816                    // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58817                    sbcs(condition,
58818                         Best,
58819                         Register(rd),
58820                         Register(rn),
58821                         Operand(Register(rm),
58822                                 shift_operand.GetType(),
58823                                 shift_operand.GetAmount()));
58824                    break;
58825                  }
58826                }
58827                break;
58828              }
58829              case 0x00e00000: {
58830                // 0x00f00000
58831                switch (instr & 0x00000fe0) {
58832                  case 0x00000060: {
58833                    // 0x00f00060
58834                    if (((instr & 0xf0000000) == 0xf0000000)) {
58835                      UnallocatedA32(instr);
58836                      return;
58837                    }
58838                    Condition condition((instr >> 28) & 0xf);
58839                    unsigned rd = (instr >> 12) & 0xf;
58840                    unsigned rn = (instr >> 16) & 0xf;
58841                    unsigned rm = instr & 0xf;
58842                    // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58843                    rscs(condition,
58844                         Register(rd),
58845                         Register(rn),
58846                         Operand(Register(rm), RRX));
58847                    break;
58848                  }
58849                  default: {
58850                    if (((instr & 0xf0000000) == 0xf0000000) ||
58851                        ((instr & 0xfe0) == 0x60)) {
58852                      UnallocatedA32(instr);
58853                      return;
58854                    }
58855                    Condition condition((instr >> 28) & 0xf);
58856                    unsigned rd = (instr >> 12) & 0xf;
58857                    unsigned rn = (instr >> 16) & 0xf;
58858                    unsigned rm = instr & 0xf;
58859                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58860                                                        (instr >> 7) & 0x1f);
58861                    // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58862                    rscs(condition,
58863                         Register(rd),
58864                         Register(rn),
58865                         Operand(Register(rm),
58866                                 shift_operand.GetType(),
58867                                 shift_operand.GetAmount()));
58868                    break;
58869                  }
58870                }
58871                break;
58872              }
58873              case 0x01000000: {
58874                // 0x01100000
58875                switch (instr & 0x00000fe0) {
58876                  case 0x00000060: {
58877                    // 0x01100060
58878                    if (((instr & 0xf0000000) == 0xf0000000)) {
58879                      UnallocatedA32(instr);
58880                      return;
58881                    }
58882                    Condition condition((instr >> 28) & 0xf);
58883                    unsigned rn = (instr >> 16) & 0xf;
58884                    unsigned rm = instr & 0xf;
58885                    // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
58886                    tst(condition,
58887                        Best,
58888                        Register(rn),
58889                        Operand(Register(rm), RRX));
58890                    if (((instr & 0xff0fff0) != 0x1100060)) {
58891                      UnpredictableA32(instr);
58892                    }
58893                    break;
58894                  }
58895                  default: {
58896                    if (((instr & 0xf0000000) == 0xf0000000) ||
58897                        ((instr & 0xfe0) == 0x60)) {
58898                      UnallocatedA32(instr);
58899                      return;
58900                    }
58901                    Condition condition((instr >> 28) & 0xf);
58902                    unsigned rn = (instr >> 16) & 0xf;
58903                    unsigned rm = instr & 0xf;
58904                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58905                                                        (instr >> 7) & 0x1f);
58906                    // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
58907                    tst(condition,
58908                        Best,
58909                        Register(rn),
58910                        Operand(Register(rm),
58911                                shift_operand.GetType(),
58912                                shift_operand.GetAmount()));
58913                    if (((instr & 0xff0f010) != 0x1100000)) {
58914                      UnpredictableA32(instr);
58915                    }
58916                    break;
58917                  }
58918                }
58919                break;
58920              }
58921              case 0x01200000: {
58922                // 0x01300000
58923                switch (instr & 0x00000fe0) {
58924                  case 0x00000060: {
58925                    // 0x01300060
58926                    if (((instr & 0xf0000000) == 0xf0000000)) {
58927                      UnallocatedA32(instr);
58928                      return;
58929                    }
58930                    Condition condition((instr >> 28) & 0xf);
58931                    unsigned rn = (instr >> 16) & 0xf;
58932                    unsigned rm = instr & 0xf;
58933                    // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
58934                    teq(condition, Register(rn), Operand(Register(rm), RRX));
58935                    if (((instr & 0xff0fff0) != 0x1300060)) {
58936                      UnpredictableA32(instr);
58937                    }
58938                    break;
58939                  }
58940                  default: {
58941                    if (((instr & 0xf0000000) == 0xf0000000) ||
58942                        ((instr & 0xfe0) == 0x60)) {
58943                      UnallocatedA32(instr);
58944                      return;
58945                    }
58946                    Condition condition((instr >> 28) & 0xf);
58947                    unsigned rn = (instr >> 16) & 0xf;
58948                    unsigned rm = instr & 0xf;
58949                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58950                                                        (instr >> 7) & 0x1f);
58951                    // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
58952                    teq(condition,
58953                        Register(rn),
58954                        Operand(Register(rm),
58955                                shift_operand.GetType(),
58956                                shift_operand.GetAmount()));
58957                    if (((instr & 0xff0f010) != 0x1300000)) {
58958                      UnpredictableA32(instr);
58959                    }
58960                    break;
58961                  }
58962                }
58963                break;
58964              }
58965              case 0x01400000: {
58966                // 0x01500000
58967                switch (instr & 0x00000fe0) {
58968                  case 0x00000060: {
58969                    // 0x01500060
58970                    if (((instr & 0xf0000000) == 0xf0000000)) {
58971                      UnallocatedA32(instr);
58972                      return;
58973                    }
58974                    Condition condition((instr >> 28) & 0xf);
58975                    unsigned rn = (instr >> 16) & 0xf;
58976                    unsigned rm = instr & 0xf;
58977                    // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
58978                    cmp(condition,
58979                        Best,
58980                        Register(rn),
58981                        Operand(Register(rm), RRX));
58982                    if (((instr & 0xff0fff0) != 0x1500060)) {
58983                      UnpredictableA32(instr);
58984                    }
58985                    break;
58986                  }
58987                  default: {
58988                    if (((instr & 0xf0000000) == 0xf0000000) ||
58989                        ((instr & 0xfe0) == 0x60)) {
58990                      UnallocatedA32(instr);
58991                      return;
58992                    }
58993                    Condition condition((instr >> 28) & 0xf);
58994                    unsigned rn = (instr >> 16) & 0xf;
58995                    unsigned rm = instr & 0xf;
58996                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58997                                                        (instr >> 7) & 0x1f);
58998                    // CMP{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
58999                    cmp(condition,
59000                        Best,
59001                        Register(rn),
59002                        Operand(Register(rm),
59003                                shift_operand.GetType(),
59004                                shift_operand.GetAmount()));
59005                    if (((instr & 0xff0f010) != 0x1500000)) {
59006                      UnpredictableA32(instr);
59007                    }
59008                    break;
59009                  }
59010                }
59011                break;
59012              }
59013              case 0x01600000: {
59014                // 0x01700000
59015                switch (instr & 0x00000fe0) {
59016                  case 0x00000060: {
59017                    // 0x01700060
59018                    if (((instr & 0xf0000000) == 0xf0000000)) {
59019                      UnallocatedA32(instr);
59020                      return;
59021                    }
59022                    Condition condition((instr >> 28) & 0xf);
59023                    unsigned rn = (instr >> 16) & 0xf;
59024                    unsigned rm = instr & 0xf;
59025                    // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59026                    cmn(condition,
59027                        Best,
59028                        Register(rn),
59029                        Operand(Register(rm), RRX));
59030                    if (((instr & 0xff0fff0) != 0x1700060)) {
59031                      UnpredictableA32(instr);
59032                    }
59033                    break;
59034                  }
59035                  default: {
59036                    if (((instr & 0xf0000000) == 0xf0000000) ||
59037                        ((instr & 0xfe0) == 0x60)) {
59038                      UnallocatedA32(instr);
59039                      return;
59040                    }
59041                    Condition condition((instr >> 28) & 0xf);
59042                    unsigned rn = (instr >> 16) & 0xf;
59043                    unsigned rm = instr & 0xf;
59044                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59045                                                        (instr >> 7) & 0x1f);
59046                    // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59047                    cmn(condition,
59048                        Best,
59049                        Register(rn),
59050                        Operand(Register(rm),
59051                                shift_operand.GetType(),
59052                                shift_operand.GetAmount()));
59053                    if (((instr & 0xff0f010) != 0x1700000)) {
59054                      UnpredictableA32(instr);
59055                    }
59056                    break;
59057                  }
59058                }
59059                break;
59060              }
59061              case 0x01800000: {
59062                // 0x01900000
59063                switch (instr & 0x00000fe0) {
59064                  case 0x00000060: {
59065                    // 0x01900060
59066                    if (((instr & 0xf0000000) == 0xf0000000)) {
59067                      UnallocatedA32(instr);
59068                      return;
59069                    }
59070                    Condition condition((instr >> 28) & 0xf);
59071                    unsigned rd = (instr >> 12) & 0xf;
59072                    unsigned rn = (instr >> 16) & 0xf;
59073                    unsigned rm = instr & 0xf;
59074                    // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59075                    orrs(condition,
59076                         Best,
59077                         Register(rd),
59078                         Register(rn),
59079                         Operand(Register(rm), RRX));
59080                    break;
59081                  }
59082                  default: {
59083                    if (((instr & 0xf0000000) == 0xf0000000) ||
59084                        ((instr & 0xfe0) == 0x60)) {
59085                      UnallocatedA32(instr);
59086                      return;
59087                    }
59088                    Condition condition((instr >> 28) & 0xf);
59089                    unsigned rd = (instr >> 12) & 0xf;
59090                    unsigned rn = (instr >> 16) & 0xf;
59091                    unsigned rm = instr & 0xf;
59092                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59093                                                        (instr >> 7) & 0x1f);
59094                    // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59095                    orrs(condition,
59096                         Best,
59097                         Register(rd),
59098                         Register(rn),
59099                         Operand(Register(rm),
59100                                 shift_operand.GetType(),
59101                                 shift_operand.GetAmount()));
59102                    break;
59103                  }
59104                }
59105                break;
59106              }
59107              case 0x01a00000: {
59108                // 0x01b00000
59109                switch (instr & 0x00000fe0) {
59110                  case 0x00000060: {
59111                    // 0x01b00060
59112                    if (((instr & 0xf0000000) == 0xf0000000)) {
59113                      UnallocatedA32(instr);
59114                      return;
59115                    }
59116                    if (((instr & 0xf0000000) != 0xf0000000)) {
59117                      Condition condition((instr >> 28) & 0xf);
59118                      unsigned rd = (instr >> 12) & 0xf;
59119                      unsigned rm = instr & 0xf;
59120                      // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; A1
59121                      rrxs(condition, Register(rd), Register(rm));
59122                      if (((instr & 0xfff0ff0) != 0x1b00060)) {
59123                        UnpredictableA32(instr);
59124                      }
59125                      return;
59126                    }
59127                    Condition condition((instr >> 28) & 0xf);
59128                    unsigned rd = (instr >> 12) & 0xf;
59129                    unsigned rm = instr & 0xf;
59130                    // MOVS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
59131                    movs(condition,
59132                         Best,
59133                         Register(rd),
59134                         Operand(Register(rm), RRX));
59135                    if (((instr & 0xfff0ff0) != 0x1b00060)) {
59136                      UnpredictableA32(instr);
59137                    }
59138                    break;
59139                  }
59140                  default: {
59141                    if (((instr & 0xf0000000) == 0xf0000000) ||
59142                        ((instr & 0xfe0) == 0x60)) {
59143                      UnallocatedA32(instr);
59144                      return;
59145                    }
59146                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
59147                        ((instr & 0xf0000000) != 0xf0000000)) {
59148                      Condition condition((instr >> 28) & 0xf);
59149                      unsigned rd = (instr >> 12) & 0xf;
59150                      unsigned rm = instr & 0xf;
59151                      uint32_t amount = (instr >> 7) & 0x1f;
59152                      if (amount == 0) amount = 32;
59153                      // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59154                      asrs(condition, Best, Register(rd), Register(rm), amount);
59155                      if (((instr & 0xfff0070) != 0x1b00040)) {
59156                        UnpredictableA32(instr);
59157                      }
59158                      return;
59159                    }
59160                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
59161                        ((instr & 0xf0000000) != 0xf0000000) &&
59162                        ((instr & 0x00000f80) != 0x00000000)) {
59163                      Condition condition((instr >> 28) & 0xf);
59164                      unsigned rd = (instr >> 12) & 0xf;
59165                      unsigned rm = instr & 0xf;
59166                      uint32_t amount = (instr >> 7) & 0x1f;
59167                      // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59168                      lsls(condition, Best, Register(rd), Register(rm), amount);
59169                      if (((instr & 0xfff0070) != 0x1b00000)) {
59170                        UnpredictableA32(instr);
59171                      }
59172                      return;
59173                    }
59174                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
59175                        ((instr & 0xf0000000) != 0xf0000000)) {
59176                      Condition condition((instr >> 28) & 0xf);
59177                      unsigned rd = (instr >> 12) & 0xf;
59178                      unsigned rm = instr & 0xf;
59179                      uint32_t amount = (instr >> 7) & 0x1f;
59180                      if (amount == 0) amount = 32;
59181                      // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59182                      lsrs(condition, Best, Register(rd), Register(rm), amount);
59183                      if (((instr & 0xfff0070) != 0x1b00020)) {
59184                        UnpredictableA32(instr);
59185                      }
59186                      return;
59187                    }
59188                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
59189                        ((instr & 0xf0000000) != 0xf0000000) &&
59190                        ((instr & 0x00000f80) != 0x00000000)) {
59191                      Condition condition((instr >> 28) & 0xf);
59192                      unsigned rd = (instr >> 12) & 0xf;
59193                      unsigned rm = instr & 0xf;
59194                      uint32_t amount = (instr >> 7) & 0x1f;
59195                      // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59196                      rors(condition, Best, Register(rd), Register(rm), amount);
59197                      if (((instr & 0xfff0070) != 0x1b00060)) {
59198                        UnpredictableA32(instr);
59199                      }
59200                      return;
59201                    }
59202                    Condition condition((instr >> 28) & 0xf);
59203                    unsigned rd = (instr >> 12) & 0xf;
59204                    unsigned rm = instr & 0xf;
59205                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59206                                                        (instr >> 7) & 0x1f);
59207                    // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
59208                    movs(condition,
59209                         Best,
59210                         Register(rd),
59211                         Operand(Register(rm),
59212                                 shift_operand.GetType(),
59213                                 shift_operand.GetAmount()));
59214                    if (((instr & 0xfff0010) != 0x1b00000)) {
59215                      UnpredictableA32(instr);
59216                    }
59217                    break;
59218                  }
59219                }
59220                break;
59221              }
59222              case 0x01c00000: {
59223                // 0x01d00000
59224                switch (instr & 0x00000fe0) {
59225                  case 0x00000060: {
59226                    // 0x01d00060
59227                    if (((instr & 0xf0000000) == 0xf0000000)) {
59228                      UnallocatedA32(instr);
59229                      return;
59230                    }
59231                    Condition condition((instr >> 28) & 0xf);
59232                    unsigned rd = (instr >> 12) & 0xf;
59233                    unsigned rn = (instr >> 16) & 0xf;
59234                    unsigned rm = instr & 0xf;
59235                    // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59236                    bics(condition,
59237                         Best,
59238                         Register(rd),
59239                         Register(rn),
59240                         Operand(Register(rm), RRX));
59241                    break;
59242                  }
59243                  default: {
59244                    if (((instr & 0xf0000000) == 0xf0000000) ||
59245                        ((instr & 0xfe0) == 0x60)) {
59246                      UnallocatedA32(instr);
59247                      return;
59248                    }
59249                    Condition condition((instr >> 28) & 0xf);
59250                    unsigned rd = (instr >> 12) & 0xf;
59251                    unsigned rn = (instr >> 16) & 0xf;
59252                    unsigned rm = instr & 0xf;
59253                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59254                                                        (instr >> 7) & 0x1f);
59255                    // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59256                    bics(condition,
59257                         Best,
59258                         Register(rd),
59259                         Register(rn),
59260                         Operand(Register(rm),
59261                                 shift_operand.GetType(),
59262                                 shift_operand.GetAmount()));
59263                    break;
59264                  }
59265                }
59266                break;
59267              }
59268              case 0x01e00000: {
59269                // 0x01f00000
59270                switch (instr & 0x00000fe0) {
59271                  case 0x00000060: {
59272                    // 0x01f00060
59273                    if (((instr & 0xf0000000) == 0xf0000000)) {
59274                      UnallocatedA32(instr);
59275                      return;
59276                    }
59277                    Condition condition((instr >> 28) & 0xf);
59278                    unsigned rd = (instr >> 12) & 0xf;
59279                    unsigned rm = instr & 0xf;
59280                    // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
59281                    mvns(condition,
59282                         Best,
59283                         Register(rd),
59284                         Operand(Register(rm), RRX));
59285                    if (((instr & 0xfff0ff0) != 0x1f00060)) {
59286                      UnpredictableA32(instr);
59287                    }
59288                    break;
59289                  }
59290                  default: {
59291                    if (((instr & 0xf0000000) == 0xf0000000) ||
59292                        ((instr & 0xfe0) == 0x60)) {
59293                      UnallocatedA32(instr);
59294                      return;
59295                    }
59296                    Condition condition((instr >> 28) & 0xf);
59297                    unsigned rd = (instr >> 12) & 0xf;
59298                    unsigned rm = instr & 0xf;
59299                    ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59300                                                        (instr >> 7) & 0x1f);
59301                    // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
59302                    mvns(condition,
59303                         Best,
59304                         Register(rd),
59305                         Operand(Register(rm),
59306                                 shift_operand.GetType(),
59307                                 shift_operand.GetAmount()));
59308                    if (((instr & 0xfff0010) != 0x1f00000)) {
59309                      UnpredictableA32(instr);
59310                    }
59311                    break;
59312                  }
59313                }
59314                break;
59315              }
59316            }
59317            break;
59318          }
59319          case 0x00100010: {
59320            // 0x00100010
59321            switch (instr & 0x00400080) {
59322              case 0x00000000: {
59323                // 0x00100010
59324                switch (instr & 0x01a00000) {
59325                  case 0x00000000: {
59326                    // 0x00100010
59327                    if (((instr & 0xf0000000) == 0xf0000000)) {
59328                      UnallocatedA32(instr);
59329                      return;
59330                    }
59331                    Condition condition((instr >> 28) & 0xf);
59332                    unsigned rd = (instr >> 12) & 0xf;
59333                    unsigned rn = (instr >> 16) & 0xf;
59334                    unsigned rm = instr & 0xf;
59335                    Shift shift((instr >> 5) & 0x3);
59336                    unsigned rs = (instr >> 8) & 0xf;
59337                    // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59338                    ands(condition,
59339                         Best,
59340                         Register(rd),
59341                         Register(rn),
59342                         Operand(Register(rm), shift.GetType(), Register(rs)));
59343                    break;
59344                  }
59345                  case 0x00200000: {
59346                    // 0x00300010
59347                    if (((instr & 0xf0000000) == 0xf0000000)) {
59348                      UnallocatedA32(instr);
59349                      return;
59350                    }
59351                    Condition condition((instr >> 28) & 0xf);
59352                    unsigned rd = (instr >> 12) & 0xf;
59353                    unsigned rn = (instr >> 16) & 0xf;
59354                    unsigned rm = instr & 0xf;
59355                    Shift shift((instr >> 5) & 0x3);
59356                    unsigned rs = (instr >> 8) & 0xf;
59357                    // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59358                    eors(condition,
59359                         Best,
59360                         Register(rd),
59361                         Register(rn),
59362                         Operand(Register(rm), shift.GetType(), Register(rs)));
59363                    break;
59364                  }
59365                  case 0x00800000: {
59366                    // 0x00900010
59367                    if (((instr & 0xf0000000) == 0xf0000000)) {
59368                      UnallocatedA32(instr);
59369                      return;
59370                    }
59371                    Condition condition((instr >> 28) & 0xf);
59372                    unsigned rd = (instr >> 12) & 0xf;
59373                    unsigned rn = (instr >> 16) & 0xf;
59374                    unsigned rm = instr & 0xf;
59375                    Shift shift((instr >> 5) & 0x3);
59376                    unsigned rs = (instr >> 8) & 0xf;
59377                    // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59378                    adds(condition,
59379                         Best,
59380                         Register(rd),
59381                         Register(rn),
59382                         Operand(Register(rm), shift.GetType(), Register(rs)));
59383                    break;
59384                  }
59385                  case 0x00a00000: {
59386                    // 0x00b00010
59387                    if (((instr & 0xf0000000) == 0xf0000000)) {
59388                      UnallocatedA32(instr);
59389                      return;
59390                    }
59391                    Condition condition((instr >> 28) & 0xf);
59392                    unsigned rd = (instr >> 12) & 0xf;
59393                    unsigned rn = (instr >> 16) & 0xf;
59394                    unsigned rm = instr & 0xf;
59395                    Shift shift((instr >> 5) & 0x3);
59396                    unsigned rs = (instr >> 8) & 0xf;
59397                    // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59398                    adcs(condition,
59399                         Best,
59400                         Register(rd),
59401                         Register(rn),
59402                         Operand(Register(rm), shift.GetType(), Register(rs)));
59403                    break;
59404                  }
59405                  case 0x01000000: {
59406                    // 0x01100010
59407                    if (((instr & 0xf0000000) == 0xf0000000)) {
59408                      UnallocatedA32(instr);
59409                      return;
59410                    }
59411                    Condition condition((instr >> 28) & 0xf);
59412                    unsigned rn = (instr >> 16) & 0xf;
59413                    unsigned rm = instr & 0xf;
59414                    Shift shift((instr >> 5) & 0x3);
59415                    unsigned rs = (instr >> 8) & 0xf;
59416                    // TST{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
59417                    tst(condition,
59418                        Best,
59419                        Register(rn),
59420                        Operand(Register(rm), shift.GetType(), Register(rs)));
59421                    if (((instr & 0xff0f090) != 0x1100010)) {
59422                      UnpredictableA32(instr);
59423                    }
59424                    break;
59425                  }
59426                  case 0x01200000: {
59427                    // 0x01300010
59428                    if (((instr & 0xf0000000) == 0xf0000000)) {
59429                      UnallocatedA32(instr);
59430                      return;
59431                    }
59432                    Condition condition((instr >> 28) & 0xf);
59433                    unsigned rn = (instr >> 16) & 0xf;
59434                    unsigned rm = instr & 0xf;
59435                    Shift shift((instr >> 5) & 0x3);
59436                    unsigned rs = (instr >> 8) & 0xf;
59437                    // TEQ{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
59438                    teq(condition,
59439                        Register(rn),
59440                        Operand(Register(rm), shift.GetType(), Register(rs)));
59441                    if (((instr & 0xff0f090) != 0x1300010)) {
59442                      UnpredictableA32(instr);
59443                    }
59444                    break;
59445                  }
59446                  case 0x01800000: {
59447                    // 0x01900010
59448                    if (((instr & 0xf0000000) == 0xf0000000)) {
59449                      UnallocatedA32(instr);
59450                      return;
59451                    }
59452                    Condition condition((instr >> 28) & 0xf);
59453                    unsigned rd = (instr >> 12) & 0xf;
59454                    unsigned rn = (instr >> 16) & 0xf;
59455                    unsigned rm = instr & 0xf;
59456                    Shift shift((instr >> 5) & 0x3);
59457                    unsigned rs = (instr >> 8) & 0xf;
59458                    // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59459                    orrs(condition,
59460                         Best,
59461                         Register(rd),
59462                         Register(rn),
59463                         Operand(Register(rm), shift.GetType(), Register(rs)));
59464                    break;
59465                  }
59466                  case 0x01a00000: {
59467                    // 0x01b00010
59468                    if (((instr & 0xf0000000) == 0xf0000000)) {
59469                      UnallocatedA32(instr);
59470                      return;
59471                    }
59472                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
59473                        ((instr & 0xf0000000) != 0xf0000000)) {
59474                      Condition condition((instr >> 28) & 0xf);
59475                      unsigned rd = (instr >> 12) & 0xf;
59476                      unsigned rm = instr & 0xf;
59477                      unsigned rs = (instr >> 8) & 0xf;
59478                      // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
59479                      asrs(condition,
59480                           Best,
59481                           Register(rd),
59482                           Register(rm),
59483                           Register(rs));
59484                      if (((instr & 0xfff00f0) != 0x1b00050)) {
59485                        UnpredictableA32(instr);
59486                      }
59487                      return;
59488                    }
59489                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
59490                        ((instr & 0xf0000000) != 0xf0000000)) {
59491                      Condition condition((instr >> 28) & 0xf);
59492                      unsigned rd = (instr >> 12) & 0xf;
59493                      unsigned rm = instr & 0xf;
59494                      unsigned rs = (instr >> 8) & 0xf;
59495                      // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
59496                      lsls(condition,
59497                           Best,
59498                           Register(rd),
59499                           Register(rm),
59500                           Register(rs));
59501                      if (((instr & 0xfff00f0) != 0x1b00010)) {
59502                        UnpredictableA32(instr);
59503                      }
59504                      return;
59505                    }
59506                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
59507                        ((instr & 0xf0000000) != 0xf0000000)) {
59508                      Condition condition((instr >> 28) & 0xf);
59509                      unsigned rd = (instr >> 12) & 0xf;
59510                      unsigned rm = instr & 0xf;
59511                      unsigned rs = (instr >> 8) & 0xf;
59512                      // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
59513                      lsrs(condition,
59514                           Best,
59515                           Register(rd),
59516                           Register(rm),
59517                           Register(rs));
59518                      if (((instr & 0xfff00f0) != 0x1b00030)) {
59519                        UnpredictableA32(instr);
59520                      }
59521                      return;
59522                    }
59523                    if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
59524                        ((instr & 0xf0000000) != 0xf0000000)) {
59525                      Condition condition((instr >> 28) & 0xf);
59526                      unsigned rd = (instr >> 12) & 0xf;
59527                      unsigned rm = instr & 0xf;
59528                      unsigned rs = (instr >> 8) & 0xf;
59529                      // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
59530                      rors(condition,
59531                           Best,
59532                           Register(rd),
59533                           Register(rm),
59534                           Register(rs));
59535                      if (((instr & 0xfff00f0) != 0x1b00070)) {
59536                        UnpredictableA32(instr);
59537                      }
59538                      return;
59539                    }
59540                    Condition condition((instr >> 28) & 0xf);
59541                    unsigned rd = (instr >> 12) & 0xf;
59542                    unsigned rm = instr & 0xf;
59543                    Shift shift((instr >> 5) & 0x3);
59544                    unsigned rs = (instr >> 8) & 0xf;
59545                    // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
59546                    movs(condition,
59547                         Best,
59548                         Register(rd),
59549                         Operand(Register(rm), shift.GetType(), Register(rs)));
59550                    if (((instr & 0xfff0090) != 0x1b00010)) {
59551                      UnpredictableA32(instr);
59552                    }
59553                    break;
59554                  }
59555                }
59556                break;
59557              }
59558              case 0x00000080: {
59559                // 0x00100090
59560                switch (instr & 0x01200060) {
59561                  case 0x00000000: {
59562                    // 0x00100090
59563                    switch (instr & 0x00800000) {
59564                      case 0x00000000: {
59565                        // 0x00100090
59566                        if (((instr & 0xf0000000) == 0xf0000000)) {
59567                          UnallocatedA32(instr);
59568                          return;
59569                        }
59570                        Condition condition((instr >> 28) & 0xf);
59571                        unsigned rd = (instr >> 16) & 0xf;
59572                        unsigned rn = instr & 0xf;
59573                        unsigned rm = (instr >> 8) & 0xf;
59574                        // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
59575                        muls(condition,
59576                             Register(rd),
59577                             Register(rn),
59578                             Register(rm));
59579                        if (((instr & 0xff0f0f0) != 0x100090)) {
59580                          UnpredictableA32(instr);
59581                        }
59582                        break;
59583                      }
59584                      case 0x00800000: {
59585                        // 0x00900090
59586                        if (((instr & 0xf0000000) == 0xf0000000)) {
59587                          UnallocatedA32(instr);
59588                          return;
59589                        }
59590                        Condition condition((instr >> 28) & 0xf);
59591                        unsigned rdlo = (instr >> 12) & 0xf;
59592                        unsigned rdhi = (instr >> 16) & 0xf;
59593                        unsigned rn = instr & 0xf;
59594                        unsigned rm = (instr >> 8) & 0xf;
59595                        // UMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
59596                        umulls(condition,
59597                               Register(rdlo),
59598                               Register(rdhi),
59599                               Register(rn),
59600                               Register(rm));
59601                        break;
59602                      }
59603                    }
59604                    break;
59605                  }
59606                  case 0x00000020: {
59607                    // 0x001000b0
59608                    if (((instr & 0xf0000000) == 0xf0000000)) {
59609                      UnallocatedA32(instr);
59610                      return;
59611                    }
59612                    Condition condition((instr >> 28) & 0xf);
59613                    unsigned rt = (instr >> 12) & 0xf;
59614                    unsigned rn = (instr >> 16) & 0xf;
59615                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59616                    unsigned rm = instr & 0xf;
59617                    // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
59618                    ldrh(condition,
59619                         Best,
59620                         Register(rt),
59621                         MemOperand(Register(rn),
59622                                    sign,
59623                                    Register(rm),
59624                                    PostIndex));
59625                    if (((instr & 0xf700ff0) != 0x1000b0)) {
59626                      UnpredictableA32(instr);
59627                    }
59628                    break;
59629                  }
59630                  case 0x00000040: {
59631                    // 0x001000d0
59632                    if (((instr & 0xf0000000) == 0xf0000000)) {
59633                      UnallocatedA32(instr);
59634                      return;
59635                    }
59636                    Condition condition((instr >> 28) & 0xf);
59637                    unsigned rt = (instr >> 12) & 0xf;
59638                    unsigned rn = (instr >> 16) & 0xf;
59639                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59640                    unsigned rm = instr & 0xf;
59641                    // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
59642                    ldrsb(condition,
59643                          Best,
59644                          Register(rt),
59645                          MemOperand(Register(rn),
59646                                     sign,
59647                                     Register(rm),
59648                                     PostIndex));
59649                    if (((instr & 0xf700ff0) != 0x1000d0)) {
59650                      UnpredictableA32(instr);
59651                    }
59652                    break;
59653                  }
59654                  case 0x00000060: {
59655                    // 0x001000f0
59656                    if (((instr & 0xf0000000) == 0xf0000000)) {
59657                      UnallocatedA32(instr);
59658                      return;
59659                    }
59660                    Condition condition((instr >> 28) & 0xf);
59661                    unsigned rt = (instr >> 12) & 0xf;
59662                    unsigned rn = (instr >> 16) & 0xf;
59663                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59664                    unsigned rm = instr & 0xf;
59665                    // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
59666                    ldrsh(condition,
59667                          Best,
59668                          Register(rt),
59669                          MemOperand(Register(rn),
59670                                     sign,
59671                                     Register(rm),
59672                                     PostIndex));
59673                    if (((instr & 0xf700ff0) != 0x1000f0)) {
59674                      UnpredictableA32(instr);
59675                    }
59676                    break;
59677                  }
59678                  case 0x00200000: {
59679                    // 0x00300090
59680                    switch (instr & 0x00800000) {
59681                      case 0x00000000: {
59682                        // 0x00300090
59683                        if (((instr & 0xf0000000) == 0xf0000000)) {
59684                          UnallocatedA32(instr);
59685                          return;
59686                        }
59687                        Condition condition((instr >> 28) & 0xf);
59688                        unsigned rd = (instr >> 16) & 0xf;
59689                        unsigned rn = instr & 0xf;
59690                        unsigned rm = (instr >> 8) & 0xf;
59691                        unsigned ra = (instr >> 12) & 0xf;
59692                        // MLAS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
59693                        mlas(condition,
59694                             Register(rd),
59695                             Register(rn),
59696                             Register(rm),
59697                             Register(ra));
59698                        break;
59699                      }
59700                      case 0x00800000: {
59701                        // 0x00b00090
59702                        if (((instr & 0xf0000000) == 0xf0000000)) {
59703                          UnallocatedA32(instr);
59704                          return;
59705                        }
59706                        Condition condition((instr >> 28) & 0xf);
59707                        unsigned rdlo = (instr >> 12) & 0xf;
59708                        unsigned rdhi = (instr >> 16) & 0xf;
59709                        unsigned rn = instr & 0xf;
59710                        unsigned rm = (instr >> 8) & 0xf;
59711                        // UMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
59712                        umlals(condition,
59713                               Register(rdlo),
59714                               Register(rdhi),
59715                               Register(rn),
59716                               Register(rm));
59717                        break;
59718                      }
59719                    }
59720                    break;
59721                  }
59722                  case 0x00200020: {
59723                    // 0x003000b0
59724                    if (((instr & 0xf0000000) == 0xf0000000)) {
59725                      UnallocatedA32(instr);
59726                      return;
59727                    }
59728                    UnimplementedA32("LDRHT", instr);
59729                    break;
59730                  }
59731                  case 0x00200040: {
59732                    // 0x003000d0
59733                    if (((instr & 0xf0000000) == 0xf0000000)) {
59734                      UnallocatedA32(instr);
59735                      return;
59736                    }
59737                    UnimplementedA32("LDRSBT", instr);
59738                    break;
59739                  }
59740                  case 0x00200060: {
59741                    // 0x003000f0
59742                    if (((instr & 0xf0000000) == 0xf0000000)) {
59743                      UnallocatedA32(instr);
59744                      return;
59745                    }
59746                    UnimplementedA32("LDRSHT", instr);
59747                    break;
59748                  }
59749                  case 0x01000000: {
59750                    // 0x01100090
59751                    switch (instr & 0x00800300) {
59752                      case 0x00800000: {
59753                        // 0x01900090
59754                        if (((instr & 0xf0000000) == 0xf0000000)) {
59755                          UnallocatedA32(instr);
59756                          return;
59757                        }
59758                        Condition condition((instr >> 28) & 0xf);
59759                        unsigned rt = (instr >> 12) & 0xf;
59760                        unsigned rn = (instr >> 16) & 0xf;
59761                        // LDA{<c>}{<q>} <Rt>, [<Rn>] ; A1
59762                        lda(condition,
59763                            Register(rt),
59764                            MemOperand(Register(rn), Offset));
59765                        if (((instr & 0xff00fff) != 0x1900c9f)) {
59766                          UnpredictableA32(instr);
59767                        }
59768                        break;
59769                      }
59770                      case 0x00800200: {
59771                        // 0x01900290
59772                        if (((instr & 0xf0000000) == 0xf0000000)) {
59773                          UnallocatedA32(instr);
59774                          return;
59775                        }
59776                        Condition condition((instr >> 28) & 0xf);
59777                        unsigned rt = (instr >> 12) & 0xf;
59778                        unsigned rn = (instr >> 16) & 0xf;
59779                        // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; A1
59780                        ldaex(condition,
59781                              Register(rt),
59782                              MemOperand(Register(rn), Offset));
59783                        if (((instr & 0xff00fff) != 0x1900e9f)) {
59784                          UnpredictableA32(instr);
59785                        }
59786                        break;
59787                      }
59788                      case 0x00800300: {
59789                        // 0x01900390
59790                        if (((instr & 0xf0000000) == 0xf0000000)) {
59791                          UnallocatedA32(instr);
59792                          return;
59793                        }
59794                        Condition condition((instr >> 28) & 0xf);
59795                        unsigned rt = (instr >> 12) & 0xf;
59796                        unsigned rn = (instr >> 16) & 0xf;
59797                        // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm_1>}] ; A1
59798                        ldrex(condition,
59799                              Register(rt),
59800                              MemOperand(Register(rn), plus, 0, Offset));
59801                        if (((instr & 0xff00fff) != 0x1900f9f)) {
59802                          UnpredictableA32(instr);
59803                        }
59804                        break;
59805                      }
59806                      default:
59807                        UnallocatedA32(instr);
59808                        break;
59809                    }
59810                    break;
59811                  }
59812                  case 0x01000020: {
59813                    // 0x011000b0
59814                    if (((instr & 0xf0000000) == 0xf0000000)) {
59815                      UnallocatedA32(instr);
59816                      return;
59817                    }
59818                    Condition condition((instr >> 28) & 0xf);
59819                    unsigned rt = (instr >> 12) & 0xf;
59820                    unsigned rn = (instr >> 16) & 0xf;
59821                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59822                    unsigned rm = instr & 0xf;
59823                    AddrMode addrmode = Offset;
59824                    // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
59825                    ldrh(condition,
59826                         Best,
59827                         Register(rt),
59828                         MemOperand(Register(rn),
59829                                    sign,
59830                                    Register(rm),
59831                                    addrmode));
59832                    if (((instr & 0xf700ff0) != 0x11000b0)) {
59833                      UnpredictableA32(instr);
59834                    }
59835                    break;
59836                  }
59837                  case 0x01000040: {
59838                    // 0x011000d0
59839                    if (((instr & 0xf0000000) == 0xf0000000)) {
59840                      UnallocatedA32(instr);
59841                      return;
59842                    }
59843                    Condition condition((instr >> 28) & 0xf);
59844                    unsigned rt = (instr >> 12) & 0xf;
59845                    unsigned rn = (instr >> 16) & 0xf;
59846                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59847                    unsigned rm = instr & 0xf;
59848                    AddrMode addrmode = Offset;
59849                    // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
59850                    ldrsb(condition,
59851                          Best,
59852                          Register(rt),
59853                          MemOperand(Register(rn),
59854                                     sign,
59855                                     Register(rm),
59856                                     addrmode));
59857                    if (((instr & 0xf700ff0) != 0x11000d0)) {
59858                      UnpredictableA32(instr);
59859                    }
59860                    break;
59861                  }
59862                  case 0x01000060: {
59863                    // 0x011000f0
59864                    if (((instr & 0xf0000000) == 0xf0000000)) {
59865                      UnallocatedA32(instr);
59866                      return;
59867                    }
59868                    Condition condition((instr >> 28) & 0xf);
59869                    unsigned rt = (instr >> 12) & 0xf;
59870                    unsigned rn = (instr >> 16) & 0xf;
59871                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59872                    unsigned rm = instr & 0xf;
59873                    AddrMode addrmode = Offset;
59874                    // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
59875                    ldrsh(condition,
59876                          Best,
59877                          Register(rt),
59878                          MemOperand(Register(rn),
59879                                     sign,
59880                                     Register(rm),
59881                                     addrmode));
59882                    if (((instr & 0xf700ff0) != 0x11000f0)) {
59883                      UnpredictableA32(instr);
59884                    }
59885                    break;
59886                  }
59887                  case 0x01200000: {
59888                    // 0x01300090
59889                    switch (instr & 0x00800300) {
59890                      case 0x00800200: {
59891                        // 0x01b00290
59892                        if (((instr & 0xf0000000) == 0xf0000000)) {
59893                          UnallocatedA32(instr);
59894                          return;
59895                        }
59896                        Condition condition((instr >> 28) & 0xf);
59897                        unsigned rt = (instr >> 12) & 0xf;
59898                        unsigned rn = (instr >> 16) & 0xf;
59899                        // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
59900                        ldaexd(condition,
59901                               Register(rt),
59902                               Register(rt + 1),
59903                               MemOperand(Register(rn), Offset));
59904                        if (((instr & 0xff00fff) != 0x1b00e9f)) {
59905                          UnpredictableA32(instr);
59906                        }
59907                        break;
59908                      }
59909                      case 0x00800300: {
59910                        // 0x01b00390
59911                        if (((instr & 0xf0000000) == 0xf0000000)) {
59912                          UnallocatedA32(instr);
59913                          return;
59914                        }
59915                        Condition condition((instr >> 28) & 0xf);
59916                        unsigned rt = (instr >> 12) & 0xf;
59917                        unsigned rn = (instr >> 16) & 0xf;
59918                        // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
59919                        ldrexd(condition,
59920                               Register(rt),
59921                               Register(rt + 1),
59922                               MemOperand(Register(rn), Offset));
59923                        if (((instr & 0xff00fff) != 0x1b00f9f)) {
59924                          UnpredictableA32(instr);
59925                        }
59926                        break;
59927                      }
59928                      default:
59929                        UnallocatedA32(instr);
59930                        break;
59931                    }
59932                    break;
59933                  }
59934                  case 0x01200020: {
59935                    // 0x013000b0
59936                    if (((instr & 0xf0000000) == 0xf0000000)) {
59937                      UnallocatedA32(instr);
59938                      return;
59939                    }
59940                    Condition condition((instr >> 28) & 0xf);
59941                    unsigned rt = (instr >> 12) & 0xf;
59942                    unsigned rn = (instr >> 16) & 0xf;
59943                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59944                    unsigned rm = instr & 0xf;
59945                    AddrMode addrmode = PreIndex;
59946                    // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
59947                    ldrh(condition,
59948                         Best,
59949                         Register(rt),
59950                         MemOperand(Register(rn),
59951                                    sign,
59952                                    Register(rm),
59953                                    addrmode));
59954                    if (((instr & 0xf700ff0) != 0x13000b0)) {
59955                      UnpredictableA32(instr);
59956                    }
59957                    break;
59958                  }
59959                  case 0x01200040: {
59960                    // 0x013000d0
59961                    if (((instr & 0xf0000000) == 0xf0000000)) {
59962                      UnallocatedA32(instr);
59963                      return;
59964                    }
59965                    Condition condition((instr >> 28) & 0xf);
59966                    unsigned rt = (instr >> 12) & 0xf;
59967                    unsigned rn = (instr >> 16) & 0xf;
59968                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59969                    unsigned rm = instr & 0xf;
59970                    AddrMode addrmode = PreIndex;
59971                    // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
59972                    ldrsb(condition,
59973                          Best,
59974                          Register(rt),
59975                          MemOperand(Register(rn),
59976                                     sign,
59977                                     Register(rm),
59978                                     addrmode));
59979                    if (((instr & 0xf700ff0) != 0x13000d0)) {
59980                      UnpredictableA32(instr);
59981                    }
59982                    break;
59983                  }
59984                  case 0x01200060: {
59985                    // 0x013000f0
59986                    if (((instr & 0xf0000000) == 0xf0000000)) {
59987                      UnallocatedA32(instr);
59988                      return;
59989                    }
59990                    Condition condition((instr >> 28) & 0xf);
59991                    unsigned rt = (instr >> 12) & 0xf;
59992                    unsigned rn = (instr >> 16) & 0xf;
59993                    Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
59994                    unsigned rm = instr & 0xf;
59995                    AddrMode addrmode = PreIndex;
59996                    // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
59997                    ldrsh(condition,
59998                          Best,
59999                          Register(rt),
60000                          MemOperand(Register(rn),
60001                                     sign,
60002                                     Register(rm),
60003                                     addrmode));
60004                    if (((instr & 0xf700ff0) != 0x13000f0)) {
60005                      UnpredictableA32(instr);
60006                    }
60007                    break;
60008                  }
60009                }
60010                break;
60011              }
60012              case 0x00400000: {
60013                // 0x00500010
60014                switch (instr & 0x01a00000) {
60015                  case 0x00000000: {
60016                    // 0x00500010
60017                    if (((instr & 0xf0000000) == 0xf0000000)) {
60018                      UnallocatedA32(instr);
60019                      return;
60020                    }
60021                    Condition condition((instr >> 28) & 0xf);
60022                    unsigned rd = (instr >> 12) & 0xf;
60023                    unsigned rn = (instr >> 16) & 0xf;
60024                    unsigned rm = instr & 0xf;
60025                    Shift shift((instr >> 5) & 0x3);
60026                    unsigned rs = (instr >> 8) & 0xf;
60027                    // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60028                    subs(condition,
60029                         Best,
60030                         Register(rd),
60031                         Register(rn),
60032                         Operand(Register(rm), shift.GetType(), Register(rs)));
60033                    break;
60034                  }
60035                  case 0x00200000: {
60036                    // 0x00700010
60037                    if (((instr & 0xf0000000) == 0xf0000000)) {
60038                      UnallocatedA32(instr);
60039                      return;
60040                    }
60041                    Condition condition((instr >> 28) & 0xf);
60042                    unsigned rd = (instr >> 12) & 0xf;
60043                    unsigned rn = (instr >> 16) & 0xf;
60044                    unsigned rm = instr & 0xf;
60045                    Shift shift((instr >> 5) & 0x3);
60046                    unsigned rs = (instr >> 8) & 0xf;
60047                    // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60048                    rsbs(condition,
60049                         Best,
60050                         Register(rd),
60051                         Register(rn),
60052                         Operand(Register(rm), shift.GetType(), Register(rs)));
60053                    break;
60054                  }
60055                  case 0x00800000: {
60056                    // 0x00d00010
60057                    if (((instr & 0xf0000000) == 0xf0000000)) {
60058                      UnallocatedA32(instr);
60059                      return;
60060                    }
60061                    Condition condition((instr >> 28) & 0xf);
60062                    unsigned rd = (instr >> 12) & 0xf;
60063                    unsigned rn = (instr >> 16) & 0xf;
60064                    unsigned rm = instr & 0xf;
60065                    Shift shift((instr >> 5) & 0x3);
60066                    unsigned rs = (instr >> 8) & 0xf;
60067                    // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60068                    sbcs(condition,
60069                         Best,
60070                         Register(rd),
60071                         Register(rn),
60072                         Operand(Register(rm), shift.GetType(), Register(rs)));
60073                    break;
60074                  }
60075                  case 0x00a00000: {
60076                    // 0x00f00010
60077                    if (((instr & 0xf0000000) == 0xf0000000)) {
60078                      UnallocatedA32(instr);
60079                      return;
60080                    }
60081                    Condition condition((instr >> 28) & 0xf);
60082                    unsigned rd = (instr >> 12) & 0xf;
60083                    unsigned rn = (instr >> 16) & 0xf;
60084                    unsigned rm = instr & 0xf;
60085                    Shift shift((instr >> 5) & 0x3);
60086                    unsigned rs = (instr >> 8) & 0xf;
60087                    // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60088                    rscs(condition,
60089                         Register(rd),
60090                         Register(rn),
60091                         Operand(Register(rm), shift.GetType(), Register(rs)));
60092                    break;
60093                  }
60094                  case 0x01000000: {
60095                    // 0x01500010
60096                    if (((instr & 0xf0000000) == 0xf0000000)) {
60097                      UnallocatedA32(instr);
60098                      return;
60099                    }
60100                    Condition condition((instr >> 28) & 0xf);
60101                    unsigned rn = (instr >> 16) & 0xf;
60102                    unsigned rm = instr & 0xf;
60103                    Shift shift((instr >> 5) & 0x3);
60104                    unsigned rs = (instr >> 8) & 0xf;
60105                    // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60106                    cmp(condition,
60107                        Best,
60108                        Register(rn),
60109                        Operand(Register(rm), shift.GetType(), Register(rs)));
60110                    if (((instr & 0xff0f090) != 0x1500010)) {
60111                      UnpredictableA32(instr);
60112                    }
60113                    break;
60114                  }
60115                  case 0x01200000: {
60116                    // 0x01700010
60117                    if (((instr & 0xf0000000) == 0xf0000000)) {
60118                      UnallocatedA32(instr);
60119                      return;
60120                    }
60121                    Condition condition((instr >> 28) & 0xf);
60122                    unsigned rn = (instr >> 16) & 0xf;
60123                    unsigned rm = instr & 0xf;
60124                    Shift shift((instr >> 5) & 0x3);
60125                    unsigned rs = (instr >> 8) & 0xf;
60126                    // CMN{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60127                    cmn(condition,
60128                        Best,
60129                        Register(rn),
60130                        Operand(Register(rm), shift.GetType(), Register(rs)));
60131                    if (((instr & 0xff0f090) != 0x1700010)) {
60132                      UnpredictableA32(instr);
60133                    }
60134                    break;
60135                  }
60136                  case 0x01800000: {
60137                    // 0x01d00010
60138                    if (((instr & 0xf0000000) == 0xf0000000)) {
60139                      UnallocatedA32(instr);
60140                      return;
60141                    }
60142                    Condition condition((instr >> 28) & 0xf);
60143                    unsigned rd = (instr >> 12) & 0xf;
60144                    unsigned rn = (instr >> 16) & 0xf;
60145                    unsigned rm = instr & 0xf;
60146                    Shift shift((instr >> 5) & 0x3);
60147                    unsigned rs = (instr >> 8) & 0xf;
60148                    // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60149                    bics(condition,
60150                         Best,
60151                         Register(rd),
60152                         Register(rn),
60153                         Operand(Register(rm), shift.GetType(), Register(rs)));
60154                    break;
60155                  }
60156                  case 0x01a00000: {
60157                    // 0x01f00010
60158                    if (((instr & 0xf0000000) == 0xf0000000)) {
60159                      UnallocatedA32(instr);
60160                      return;
60161                    }
60162                    Condition condition((instr >> 28) & 0xf);
60163                    unsigned rd = (instr >> 12) & 0xf;
60164                    unsigned rm = instr & 0xf;
60165                    Shift shift((instr >> 5) & 0x3);
60166                    unsigned rs = (instr >> 8) & 0xf;
60167                    // MVNS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
60168                    mvns(condition,
60169                         Best,
60170                         Register(rd),
60171                         Operand(Register(rm), shift.GetType(), Register(rs)));
60172                    if (((instr & 0xfff0090) != 0x1f00010)) {
60173                      UnpredictableA32(instr);
60174                    }
60175                    break;
60176                  }
60177                }
60178                break;
60179              }
60180              case 0x00400080: {
60181                // 0x00500090
60182                switch (instr & 0x00000060) {
60183                  case 0x00000000: {
60184                    // 0x00500090
60185                    switch (instr & 0x01a00000) {
60186                      case 0x00800000: {
60187                        // 0x00d00090
60188                        if (((instr & 0xf0000000) == 0xf0000000)) {
60189                          UnallocatedA32(instr);
60190                          return;
60191                        }
60192                        Condition condition((instr >> 28) & 0xf);
60193                        unsigned rdlo = (instr >> 12) & 0xf;
60194                        unsigned rdhi = (instr >> 16) & 0xf;
60195                        unsigned rn = instr & 0xf;
60196                        unsigned rm = (instr >> 8) & 0xf;
60197                        // SMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60198                        smulls(condition,
60199                               Register(rdlo),
60200                               Register(rdhi),
60201                               Register(rn),
60202                               Register(rm));
60203                        break;
60204                      }
60205                      case 0x00a00000: {
60206                        // 0x00f00090
60207                        if (((instr & 0xf0000000) == 0xf0000000)) {
60208                          UnallocatedA32(instr);
60209                          return;
60210                        }
60211                        Condition condition((instr >> 28) & 0xf);
60212                        unsigned rdlo = (instr >> 12) & 0xf;
60213                        unsigned rdhi = (instr >> 16) & 0xf;
60214                        unsigned rn = instr & 0xf;
60215                        unsigned rm = (instr >> 8) & 0xf;
60216                        // SMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60217                        smlals(condition,
60218                               Register(rdlo),
60219                               Register(rdhi),
60220                               Register(rn),
60221                               Register(rm));
60222                        break;
60223                      }
60224                      case 0x01800000: {
60225                        // 0x01d00090
60226                        switch (instr & 0x00000300) {
60227                          case 0x00000000: {
60228                            // 0x01d00090
60229                            if (((instr & 0xf0000000) == 0xf0000000)) {
60230                              UnallocatedA32(instr);
60231                              return;
60232                            }
60233                            Condition condition((instr >> 28) & 0xf);
60234                            unsigned rt = (instr >> 12) & 0xf;
60235                            unsigned rn = (instr >> 16) & 0xf;
60236                            // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60237                            ldab(condition,
60238                                 Register(rt),
60239                                 MemOperand(Register(rn), Offset));
60240                            if (((instr & 0xff00fff) != 0x1d00c9f)) {
60241                              UnpredictableA32(instr);
60242                            }
60243                            break;
60244                          }
60245                          case 0x00000200: {
60246                            // 0x01d00290
60247                            if (((instr & 0xf0000000) == 0xf0000000)) {
60248                              UnallocatedA32(instr);
60249                              return;
60250                            }
60251                            Condition condition((instr >> 28) & 0xf);
60252                            unsigned rt = (instr >> 12) & 0xf;
60253                            unsigned rn = (instr >> 16) & 0xf;
60254                            // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60255                            ldaexb(condition,
60256                                   Register(rt),
60257                                   MemOperand(Register(rn), Offset));
60258                            if (((instr & 0xff00fff) != 0x1d00e9f)) {
60259                              UnpredictableA32(instr);
60260                            }
60261                            break;
60262                          }
60263                          case 0x00000300: {
60264                            // 0x01d00390
60265                            if (((instr & 0xf0000000) == 0xf0000000)) {
60266                              UnallocatedA32(instr);
60267                              return;
60268                            }
60269                            Condition condition((instr >> 28) & 0xf);
60270                            unsigned rt = (instr >> 12) & 0xf;
60271                            unsigned rn = (instr >> 16) & 0xf;
60272                            // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60273                            ldrexb(condition,
60274                                   Register(rt),
60275                                   MemOperand(Register(rn), Offset));
60276                            if (((instr & 0xff00fff) != 0x1d00f9f)) {
60277                              UnpredictableA32(instr);
60278                            }
60279                            break;
60280                          }
60281                          default:
60282                            UnallocatedA32(instr);
60283                            break;
60284                        }
60285                        break;
60286                      }
60287                      case 0x01a00000: {
60288                        // 0x01f00090
60289                        switch (instr & 0x00000300) {
60290                          case 0x00000000: {
60291                            // 0x01f00090
60292                            if (((instr & 0xf0000000) == 0xf0000000)) {
60293                              UnallocatedA32(instr);
60294                              return;
60295                            }
60296                            Condition condition((instr >> 28) & 0xf);
60297                            unsigned rt = (instr >> 12) & 0xf;
60298                            unsigned rn = (instr >> 16) & 0xf;
60299                            // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60300                            ldah(condition,
60301                                 Register(rt),
60302                                 MemOperand(Register(rn), Offset));
60303                            if (((instr & 0xff00fff) != 0x1f00c9f)) {
60304                              UnpredictableA32(instr);
60305                            }
60306                            break;
60307                          }
60308                          case 0x00000200: {
60309                            // 0x01f00290
60310                            if (((instr & 0xf0000000) == 0xf0000000)) {
60311                              UnallocatedA32(instr);
60312                              return;
60313                            }
60314                            Condition condition((instr >> 28) & 0xf);
60315                            unsigned rt = (instr >> 12) & 0xf;
60316                            unsigned rn = (instr >> 16) & 0xf;
60317                            // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60318                            ldaexh(condition,
60319                                   Register(rt),
60320                                   MemOperand(Register(rn), Offset));
60321                            if (((instr & 0xff00fff) != 0x1f00e9f)) {
60322                              UnpredictableA32(instr);
60323                            }
60324                            break;
60325                          }
60326                          case 0x00000300: {
60327                            // 0x01f00390
60328                            if (((instr & 0xf0000000) == 0xf0000000)) {
60329                              UnallocatedA32(instr);
60330                              return;
60331                            }
60332                            Condition condition((instr >> 28) & 0xf);
60333                            unsigned rt = (instr >> 12) & 0xf;
60334                            unsigned rn = (instr >> 16) & 0xf;
60335                            // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60336                            ldrexh(condition,
60337                                   Register(rt),
60338                                   MemOperand(Register(rn), Offset));
60339                            if (((instr & 0xff00fff) != 0x1f00f9f)) {
60340                              UnpredictableA32(instr);
60341                            }
60342                            break;
60343                          }
60344                          default:
60345                            UnallocatedA32(instr);
60346                            break;
60347                        }
60348                        break;
60349                      }
60350                      default:
60351                        UnallocatedA32(instr);
60352                        break;
60353                    }
60354                    break;
60355                  }
60356                  case 0x00000020: {
60357                    // 0x005000b0
60358                    switch (instr & 0x01200000) {
60359                      case 0x00000000: {
60360                        // 0x005000b0
60361                        switch (instr & 0x000f0000) {
60362                          case 0x000f0000: {
60363                            // 0x005f00b0
60364                            if (((instr & 0xf0000000) == 0xf0000000) ||
60365                                ((instr & 0x1200000) == 0x200000)) {
60366                              UnallocatedA32(instr);
60367                              return;
60368                            }
60369                            Condition condition((instr >> 28) & 0xf);
60370                            unsigned rt = (instr >> 12) & 0xf;
60371                            uint32_t U = (instr >> 23) & 0x1;
60372                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60373                            if (U == 0) imm = -imm;
60374                            bool minus_zero = (imm == 0) && (U == 0);
60375                            Location location(imm, kA32PcDelta);
60376                            // LDRH{<c>}{<q>} <Rt>, <label> ; A1
60377                            if (minus_zero) {
60378                              ldrh(condition,
60379                                   Best,
60380                                   Register(rt),
60381                                   MemOperand(pc, minus, 0));
60382                            } else {
60383                              ldrh(condition, Register(rt), &location);
60384                            }
60385                            if (((instr & 0xf7f00f0) != 0x15f00b0)) {
60386                              UnpredictableA32(instr);
60387                            }
60388                            break;
60389                          }
60390                          default: {
60391                            if (((instr & 0xf0000000) == 0xf0000000) ||
60392                                ((instr & 0xf0000) == 0xf0000)) {
60393                              UnallocatedA32(instr);
60394                              return;
60395                            }
60396                            Condition condition((instr >> 28) & 0xf);
60397                            unsigned rt = (instr >> 12) & 0xf;
60398                            unsigned rn = (instr >> 16) & 0xf;
60399                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60400                                                                   : plus);
60401                            int32_t offset =
60402                                (instr & 0xf) | ((instr >> 4) & 0xf0);
60403                            // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
60404                            ldrh(condition,
60405                                 Best,
60406                                 Register(rt),
60407                                 MemOperand(Register(rn),
60408                                            sign,
60409                                            offset,
60410                                            PostIndex));
60411                            break;
60412                          }
60413                        }
60414                        break;
60415                      }
60416                      case 0x00200000: {
60417                        // 0x007000b0
60418                        if (((instr & 0xf0000000) == 0xf0000000)) {
60419                          UnallocatedA32(instr);
60420                          return;
60421                        }
60422                        UnimplementedA32("LDRHT", instr);
60423                        break;
60424                      }
60425                      case 0x01000000: {
60426                        // 0x015000b0
60427                        switch (instr & 0x000f0000) {
60428                          case 0x000f0000: {
60429                            // 0x015f00b0
60430                            if (((instr & 0xf0000000) == 0xf0000000) ||
60431                                ((instr & 0x1200000) == 0x200000)) {
60432                              UnallocatedA32(instr);
60433                              return;
60434                            }
60435                            Condition condition((instr >> 28) & 0xf);
60436                            unsigned rt = (instr >> 12) & 0xf;
60437                            uint32_t U = (instr >> 23) & 0x1;
60438                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60439                            if (U == 0) imm = -imm;
60440                            bool minus_zero = (imm == 0) && (U == 0);
60441                            Location location(imm, kA32PcDelta);
60442                            // LDRH{<c>}{<q>} <Rt>, <label> ; A1
60443                            if (minus_zero) {
60444                              ldrh(condition,
60445                                   Best,
60446                                   Register(rt),
60447                                   MemOperand(pc, minus, 0));
60448                            } else {
60449                              ldrh(condition, Register(rt), &location);
60450                            }
60451                            if (((instr & 0xf7f00f0) != 0x15f00b0)) {
60452                              UnpredictableA32(instr);
60453                            }
60454                            break;
60455                          }
60456                          default: {
60457                            if (((instr & 0xf0000000) == 0xf0000000) ||
60458                                ((instr & 0xf0000) == 0xf0000)) {
60459                              UnallocatedA32(instr);
60460                              return;
60461                            }
60462                            Condition condition((instr >> 28) & 0xf);
60463                            unsigned rt = (instr >> 12) & 0xf;
60464                            unsigned rn = (instr >> 16) & 0xf;
60465                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60466                                                                   : plus);
60467                            int32_t offset =
60468                                (instr & 0xf) | ((instr >> 4) & 0xf0);
60469                            // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
60470                            ldrh(condition,
60471                                 Best,
60472                                 Register(rt),
60473                                 MemOperand(Register(rn),
60474                                            sign,
60475                                            offset,
60476                                            Offset));
60477                            break;
60478                          }
60479                        }
60480                        break;
60481                      }
60482                      case 0x01200000: {
60483                        // 0x017000b0
60484                        switch (instr & 0x000f0000) {
60485                          case 0x000f0000: {
60486                            // 0x017f00b0
60487                            if (((instr & 0xf0000000) == 0xf0000000) ||
60488                                ((instr & 0x1200000) == 0x200000)) {
60489                              UnallocatedA32(instr);
60490                              return;
60491                            }
60492                            Condition condition((instr >> 28) & 0xf);
60493                            unsigned rt = (instr >> 12) & 0xf;
60494                            uint32_t U = (instr >> 23) & 0x1;
60495                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60496                            if (U == 0) imm = -imm;
60497                            bool minus_zero = (imm == 0) && (U == 0);
60498                            Location location(imm, kA32PcDelta);
60499                            // LDRH{<c>}{<q>} <Rt>, <label> ; A1
60500                            if (minus_zero) {
60501                              ldrh(condition,
60502                                   Best,
60503                                   Register(rt),
60504                                   MemOperand(pc, minus, 0));
60505                            } else {
60506                              ldrh(condition, Register(rt), &location);
60507                            }
60508                            if (((instr & 0xf7f00f0) != 0x15f00b0)) {
60509                              UnpredictableA32(instr);
60510                            }
60511                            break;
60512                          }
60513                          default: {
60514                            if (((instr & 0xf0000000) == 0xf0000000) ||
60515                                ((instr & 0xf0000) == 0xf0000)) {
60516                              UnallocatedA32(instr);
60517                              return;
60518                            }
60519                            Condition condition((instr >> 28) & 0xf);
60520                            unsigned rt = (instr >> 12) & 0xf;
60521                            unsigned rn = (instr >> 16) & 0xf;
60522                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60523                                                                   : plus);
60524                            int32_t offset =
60525                                (instr & 0xf) | ((instr >> 4) & 0xf0);
60526                            // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 NOLINT(whitespace/line_length)
60527                            ldrh(condition,
60528                                 Best,
60529                                 Register(rt),
60530                                 MemOperand(Register(rn),
60531                                            sign,
60532                                            offset,
60533                                            PreIndex));
60534                            break;
60535                          }
60536                        }
60537                        break;
60538                      }
60539                    }
60540                    break;
60541                  }
60542                  case 0x00000040: {
60543                    // 0x005000d0
60544                    switch (instr & 0x01200000) {
60545                      case 0x00000000: {
60546                        // 0x005000d0
60547                        switch (instr & 0x000f0000) {
60548                          case 0x000f0000: {
60549                            // 0x005f00d0
60550                            if (((instr & 0xf0000000) == 0xf0000000) ||
60551                                ((instr & 0x1200000) == 0x200000)) {
60552                              UnallocatedA32(instr);
60553                              return;
60554                            }
60555                            Condition condition((instr >> 28) & 0xf);
60556                            unsigned rt = (instr >> 12) & 0xf;
60557                            uint32_t U = (instr >> 23) & 0x1;
60558                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60559                            if (U == 0) imm = -imm;
60560                            bool minus_zero = (imm == 0) && (U == 0);
60561                            Location location(imm, kA32PcDelta);
60562                            // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
60563                            if (minus_zero) {
60564                              ldrsb(condition,
60565                                    Best,
60566                                    Register(rt),
60567                                    MemOperand(pc, minus, 0));
60568                            } else {
60569                              ldrsb(condition, Register(rt), &location);
60570                            }
60571                            if (((instr & 0xf7f00f0) != 0x15f00d0)) {
60572                              UnpredictableA32(instr);
60573                            }
60574                            break;
60575                          }
60576                          default: {
60577                            if (((instr & 0xf0000000) == 0xf0000000) ||
60578                                ((instr & 0xf0000) == 0xf0000)) {
60579                              UnallocatedA32(instr);
60580                              return;
60581                            }
60582                            Condition condition((instr >> 28) & 0xf);
60583                            unsigned rt = (instr >> 12) & 0xf;
60584                            unsigned rn = (instr >> 16) & 0xf;
60585                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60586                                                                   : plus);
60587                            int32_t offset =
60588                                (instr & 0xf) | ((instr >> 4) & 0xf0);
60589                            // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
60590                            ldrsb(condition,
60591                                  Best,
60592                                  Register(rt),
60593                                  MemOperand(Register(rn),
60594                                             sign,
60595                                             offset,
60596                                             PostIndex));
60597                            break;
60598                          }
60599                        }
60600                        break;
60601                      }
60602                      case 0x00200000: {
60603                        // 0x007000d0
60604                        if (((instr & 0xf0000000) == 0xf0000000)) {
60605                          UnallocatedA32(instr);
60606                          return;
60607                        }
60608                        UnimplementedA32("LDRSBT", instr);
60609                        break;
60610                      }
60611                      case 0x01000000: {
60612                        // 0x015000d0
60613                        switch (instr & 0x000f0000) {
60614                          case 0x000f0000: {
60615                            // 0x015f00d0
60616                            if (((instr & 0xf0000000) == 0xf0000000) ||
60617                                ((instr & 0x1200000) == 0x200000)) {
60618                              UnallocatedA32(instr);
60619                              return;
60620                            }
60621                            Condition condition((instr >> 28) & 0xf);
60622                            unsigned rt = (instr >> 12) & 0xf;
60623                            uint32_t U = (instr >> 23) & 0x1;
60624                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60625                            if (U == 0) imm = -imm;
60626                            bool minus_zero = (imm == 0) && (U == 0);
60627                            Location location(imm, kA32PcDelta);
60628                            // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
60629                            if (minus_zero) {
60630                              ldrsb(condition,
60631                                    Best,
60632                                    Register(rt),
60633                                    MemOperand(pc, minus, 0));
60634                            } else {
60635                              ldrsb(condition, Register(rt), &location);
60636                            }
60637                            if (((instr & 0xf7f00f0) != 0x15f00d0)) {
60638                              UnpredictableA32(instr);
60639                            }
60640                            break;
60641                          }
60642                          default: {
60643                            if (((instr & 0xf0000000) == 0xf0000000) ||
60644                                ((instr & 0xf0000) == 0xf0000)) {
60645                              UnallocatedA32(instr);
60646                              return;
60647                            }
60648                            Condition condition((instr >> 28) & 0xf);
60649                            unsigned rt = (instr >> 12) & 0xf;
60650                            unsigned rn = (instr >> 16) & 0xf;
60651                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60652                                                                   : plus);
60653                            int32_t offset =
60654                                (instr & 0xf) | ((instr >> 4) & 0xf0);
60655                            // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
60656                            ldrsb(condition,
60657                                  Best,
60658                                  Register(rt),
60659                                  MemOperand(Register(rn),
60660                                             sign,
60661                                             offset,
60662                                             Offset));
60663                            break;
60664                          }
60665                        }
60666                        break;
60667                      }
60668                      case 0x01200000: {
60669                        // 0x017000d0
60670                        switch (instr & 0x000f0000) {
60671                          case 0x000f0000: {
60672                            // 0x017f00d0
60673                            if (((instr & 0xf0000000) == 0xf0000000) ||
60674                                ((instr & 0x1200000) == 0x200000)) {
60675                              UnallocatedA32(instr);
60676                              return;
60677                            }
60678                            Condition condition((instr >> 28) & 0xf);
60679                            unsigned rt = (instr >> 12) & 0xf;
60680                            uint32_t U = (instr >> 23) & 0x1;
60681                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60682                            if (U == 0) imm = -imm;
60683                            bool minus_zero = (imm == 0) && (U == 0);
60684                            Location location(imm, kA32PcDelta);
60685                            // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
60686                            if (minus_zero) {
60687                              ldrsb(condition,
60688                                    Best,
60689                                    Register(rt),
60690                                    MemOperand(pc, minus, 0));
60691                            } else {
60692                              ldrsb(condition, Register(rt), &location);
60693                            }
60694                            if (((instr & 0xf7f00f0) != 0x15f00d0)) {
60695                              UnpredictableA32(instr);
60696                            }
60697                            break;
60698                          }
60699                          default: {
60700                            if (((instr & 0xf0000000) == 0xf0000000) ||
60701                                ((instr & 0xf0000) == 0xf0000)) {
60702                              UnallocatedA32(instr);
60703                              return;
60704                            }
60705                            Condition condition((instr >> 28) & 0xf);
60706                            unsigned rt = (instr >> 12) & 0xf;
60707                            unsigned rn = (instr >> 16) & 0xf;
60708                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60709                                                                   : plus);
60710                            int32_t offset =
60711                                (instr & 0xf) | ((instr >> 4) & 0xf0);
60712                            // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
60713                            ldrsb(condition,
60714                                  Best,
60715                                  Register(rt),
60716                                  MemOperand(Register(rn),
60717                                             sign,
60718                                             offset,
60719                                             PreIndex));
60720                            break;
60721                          }
60722                        }
60723                        break;
60724                      }
60725                    }
60726                    break;
60727                  }
60728                  case 0x00000060: {
60729                    // 0x005000f0
60730                    switch (instr & 0x01200000) {
60731                      case 0x00000000: {
60732                        // 0x005000f0
60733                        switch (instr & 0x000f0000) {
60734                          case 0x000f0000: {
60735                            // 0x005f00f0
60736                            if (((instr & 0xf0000000) == 0xf0000000) ||
60737                                ((instr & 0x1200000) == 0x200000)) {
60738                              UnallocatedA32(instr);
60739                              return;
60740                            }
60741                            Condition condition((instr >> 28) & 0xf);
60742                            unsigned rt = (instr >> 12) & 0xf;
60743                            uint32_t U = (instr >> 23) & 0x1;
60744                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60745                            if (U == 0) imm = -imm;
60746                            bool minus_zero = (imm == 0) && (U == 0);
60747                            Location location(imm, kA32PcDelta);
60748                            // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
60749                            if (minus_zero) {
60750                              ldrsh(condition,
60751                                    Best,
60752                                    Register(rt),
60753                                    MemOperand(pc, minus, 0));
60754                            } else {
60755                              ldrsh(condition, Register(rt), &location);
60756                            }
60757                            if (((instr & 0xf7f00f0) != 0x15f00f0)) {
60758                              UnpredictableA32(instr);
60759                            }
60760                            break;
60761                          }
60762                          default: {
60763                            if (((instr & 0xf0000000) == 0xf0000000) ||
60764                                ((instr & 0xf0000) == 0xf0000)) {
60765                              UnallocatedA32(instr);
60766                              return;
60767                            }
60768                            Condition condition((instr >> 28) & 0xf);
60769                            unsigned rt = (instr >> 12) & 0xf;
60770                            unsigned rn = (instr >> 16) & 0xf;
60771                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60772                                                                   : plus);
60773                            int32_t offset =
60774                                (instr & 0xf) | ((instr >> 4) & 0xf0);
60775                            // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
60776                            ldrsh(condition,
60777                                  Best,
60778                                  Register(rt),
60779                                  MemOperand(Register(rn),
60780                                             sign,
60781                                             offset,
60782                                             PostIndex));
60783                            break;
60784                          }
60785                        }
60786                        break;
60787                      }
60788                      case 0x00200000: {
60789                        // 0x007000f0
60790                        if (((instr & 0xf0000000) == 0xf0000000)) {
60791                          UnallocatedA32(instr);
60792                          return;
60793                        }
60794                        UnimplementedA32("LDRSHT", instr);
60795                        break;
60796                      }
60797                      case 0x01000000: {
60798                        // 0x015000f0
60799                        switch (instr & 0x000f0000) {
60800                          case 0x000f0000: {
60801                            // 0x015f00f0
60802                            if (((instr & 0xf0000000) == 0xf0000000) ||
60803                                ((instr & 0x1200000) == 0x200000)) {
60804                              UnallocatedA32(instr);
60805                              return;
60806                            }
60807                            Condition condition((instr >> 28) & 0xf);
60808                            unsigned rt = (instr >> 12) & 0xf;
60809                            uint32_t U = (instr >> 23) & 0x1;
60810                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60811                            if (U == 0) imm = -imm;
60812                            bool minus_zero = (imm == 0) && (U == 0);
60813                            Location location(imm, kA32PcDelta);
60814                            // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
60815                            if (minus_zero) {
60816                              ldrsh(condition,
60817                                    Best,
60818                                    Register(rt),
60819                                    MemOperand(pc, minus, 0));
60820                            } else {
60821                              ldrsh(condition, Register(rt), &location);
60822                            }
60823                            if (((instr & 0xf7f00f0) != 0x15f00f0)) {
60824                              UnpredictableA32(instr);
60825                            }
60826                            break;
60827                          }
60828                          default: {
60829                            if (((instr & 0xf0000000) == 0xf0000000) ||
60830                                ((instr & 0xf0000) == 0xf0000)) {
60831                              UnallocatedA32(instr);
60832                              return;
60833                            }
60834                            Condition condition((instr >> 28) & 0xf);
60835                            unsigned rt = (instr >> 12) & 0xf;
60836                            unsigned rn = (instr >> 16) & 0xf;
60837                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60838                                                                   : plus);
60839                            int32_t offset =
60840                                (instr & 0xf) | ((instr >> 4) & 0xf0);
60841                            // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
60842                            ldrsh(condition,
60843                                  Best,
60844                                  Register(rt),
60845                                  MemOperand(Register(rn),
60846                                             sign,
60847                                             offset,
60848                                             Offset));
60849                            break;
60850                          }
60851                        }
60852                        break;
60853                      }
60854                      case 0x01200000: {
60855                        // 0x017000f0
60856                        switch (instr & 0x000f0000) {
60857                          case 0x000f0000: {
60858                            // 0x017f00f0
60859                            if (((instr & 0xf0000000) == 0xf0000000) ||
60860                                ((instr & 0x1200000) == 0x200000)) {
60861                              UnallocatedA32(instr);
60862                              return;
60863                            }
60864                            Condition condition((instr >> 28) & 0xf);
60865                            unsigned rt = (instr >> 12) & 0xf;
60866                            uint32_t U = (instr >> 23) & 0x1;
60867                            int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60868                            if (U == 0) imm = -imm;
60869                            bool minus_zero = (imm == 0) && (U == 0);
60870                            Location location(imm, kA32PcDelta);
60871                            // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
60872                            if (minus_zero) {
60873                              ldrsh(condition,
60874                                    Best,
60875                                    Register(rt),
60876                                    MemOperand(pc, minus, 0));
60877                            } else {
60878                              ldrsh(condition, Register(rt), &location);
60879                            }
60880                            if (((instr & 0xf7f00f0) != 0x15f00f0)) {
60881                              UnpredictableA32(instr);
60882                            }
60883                            break;
60884                          }
60885                          default: {
60886                            if (((instr & 0xf0000000) == 0xf0000000) ||
60887                                ((instr & 0xf0000) == 0xf0000)) {
60888                              UnallocatedA32(instr);
60889                              return;
60890                            }
60891                            Condition condition((instr >> 28) & 0xf);
60892                            unsigned rt = (instr >> 12) & 0xf;
60893                            unsigned rn = (instr >> 16) & 0xf;
60894                            Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60895                                                                   : plus);
60896                            int32_t offset =
60897                                (instr & 0xf) | ((instr >> 4) & 0xf0);
60898                            // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
60899                            ldrsh(condition,
60900                                  Best,
60901                                  Register(rt),
60902                                  MemOperand(Register(rn),
60903                                             sign,
60904                                             offset,
60905                                             PreIndex));
60906                            break;
60907                          }
60908                        }
60909                        break;
60910                      }
60911                    }
60912                    break;
60913                  }
60914                }
60915                break;
60916              }
60917            }
60918            break;
60919          }
60920        }
60921        break;
60922      }
60923      case 0x02000000: {
60924        // 0x02000000
60925        switch (instr & 0x01b00000) {
60926          case 0x00000000: {
60927            // 0x02000000
60928            switch (instr & 0x00400000) {
60929              case 0x00000000: {
60930                // 0x02000000
60931                if (((instr & 0xf0000000) == 0xf0000000)) {
60932                  UnallocatedA32(instr);
60933                  return;
60934                }
60935                Condition condition((instr >> 28) & 0xf);
60936                unsigned rd = (instr >> 12) & 0xf;
60937                unsigned rn = (instr >> 16) & 0xf;
60938                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60939                // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
60940                and_(condition, Best, Register(rd), Register(rn), imm);
60941                break;
60942              }
60943              case 0x00400000: {
60944                // 0x02400000
60945                switch (instr & 0x000d0000) {
60946                  case 0x000d0000: {
60947                    // 0x024d0000
60948                    switch (instr & 0x00020000) {
60949                      case 0x00000000: {
60950                        // 0x024d0000
60951                        if (((instr & 0xf0000000) == 0xf0000000)) {
60952                          UnallocatedA32(instr);
60953                          return;
60954                        }
60955                        Condition condition((instr >> 28) & 0xf);
60956                        unsigned rd = (instr >> 12) & 0xf;
60957                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60958                        // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
60959                        sub(condition, Best, Register(rd), sp, imm);
60960                        break;
60961                      }
60962                      case 0x00020000: {
60963                        // 0x024f0000
60964                        if (((instr & 0xf0000000) == 0xf0000000)) {
60965                          UnallocatedA32(instr);
60966                          return;
60967                        }
60968                        if (((instr & 0xf0000000) != 0xf0000000) &&
60969                            ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x0))) {
60970                          Condition condition((instr >> 28) & 0xf);
60971                          unsigned rd = (instr >> 12) & 0xf;
60972                          uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60973                          // SUB{<c>}{<q>} <Rd>, PC, #<const> ; A2
60974                          sub(condition, Best, Register(rd), pc, imm);
60975                          return;
60976                        }
60977                        Condition condition((instr >> 28) & 0xf);
60978                        unsigned rd = (instr >> 12) & 0xf;
60979                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60980                        Location location(UnsignedNegate(imm), kA32PcDelta);
60981                        // ADR{<c>}{<q>} <Rd>, <label> ; A2
60982                        adr(condition, Best, Register(rd), &location);
60983                        break;
60984                      }
60985                    }
60986                    break;
60987                  }
60988                  default: {
60989                    if (((instr & 0xf0000000) == 0xf0000000) ||
60990                        ((instr & 0xd0000) == 0xd0000)) {
60991                      UnallocatedA32(instr);
60992                      return;
60993                    }
60994                    Condition condition((instr >> 28) & 0xf);
60995                    unsigned rd = (instr >> 12) & 0xf;
60996                    unsigned rn = (instr >> 16) & 0xf;
60997                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
60998                    // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
60999                    sub(condition, Best, Register(rd), Register(rn), imm);
61000                    break;
61001                  }
61002                }
61003                break;
61004              }
61005            }
61006            break;
61007          }
61008          case 0x00100000: {
61009            // 0x02100000
61010            switch (instr & 0x00400000) {
61011              case 0x00000000: {
61012                // 0x02100000
61013                if (((instr & 0xf0000000) == 0xf0000000)) {
61014                  UnallocatedA32(instr);
61015                  return;
61016                }
61017                Condition condition((instr >> 28) & 0xf);
61018                unsigned rd = (instr >> 12) & 0xf;
61019                unsigned rn = (instr >> 16) & 0xf;
61020                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61021                // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61022                ands(condition, Best, Register(rd), Register(rn), imm);
61023                break;
61024              }
61025              case 0x00400000: {
61026                // 0x02500000
61027                switch (instr & 0x000f0000) {
61028                  case 0x000d0000: {
61029                    // 0x025d0000
61030                    if (((instr & 0xf0000000) == 0xf0000000)) {
61031                      UnallocatedA32(instr);
61032                      return;
61033                    }
61034                    Condition condition((instr >> 28) & 0xf);
61035                    unsigned rd = (instr >> 12) & 0xf;
61036                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61037                    // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61038                    subs(condition, Best, Register(rd), sp, imm);
61039                    break;
61040                  }
61041                  default: {
61042                    if (((instr & 0xf0000000) == 0xf0000000) ||
61043                        ((instr & 0xf0000) == 0xd0000)) {
61044                      UnallocatedA32(instr);
61045                      return;
61046                    }
61047                    Condition condition((instr >> 28) & 0xf);
61048                    unsigned rd = (instr >> 12) & 0xf;
61049                    unsigned rn = (instr >> 16) & 0xf;
61050                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61051                    // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61052                    subs(condition, Best, Register(rd), Register(rn), imm);
61053                    break;
61054                  }
61055                }
61056                break;
61057              }
61058            }
61059            break;
61060          }
61061          case 0x00200000: {
61062            // 0x02200000
61063            switch (instr & 0x00400000) {
61064              case 0x00000000: {
61065                // 0x02200000
61066                if (((instr & 0xf0000000) == 0xf0000000)) {
61067                  UnallocatedA32(instr);
61068                  return;
61069                }
61070                Condition condition((instr >> 28) & 0xf);
61071                unsigned rd = (instr >> 12) & 0xf;
61072                unsigned rn = (instr >> 16) & 0xf;
61073                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61074                // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61075                eor(condition, Best, Register(rd), Register(rn), imm);
61076                break;
61077              }
61078              case 0x00400000: {
61079                // 0x02600000
61080                if (((instr & 0xf0000000) == 0xf0000000)) {
61081                  UnallocatedA32(instr);
61082                  return;
61083                }
61084                Condition condition((instr >> 28) & 0xf);
61085                unsigned rd = (instr >> 12) & 0xf;
61086                unsigned rn = (instr >> 16) & 0xf;
61087                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61088                // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61089                rsb(condition, Best, Register(rd), Register(rn), imm);
61090                break;
61091              }
61092            }
61093            break;
61094          }
61095          case 0x00300000: {
61096            // 0x02300000
61097            switch (instr & 0x00400000) {
61098              case 0x00000000: {
61099                // 0x02300000
61100                if (((instr & 0xf0000000) == 0xf0000000)) {
61101                  UnallocatedA32(instr);
61102                  return;
61103                }
61104                Condition condition((instr >> 28) & 0xf);
61105                unsigned rd = (instr >> 12) & 0xf;
61106                unsigned rn = (instr >> 16) & 0xf;
61107                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61108                // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61109                eors(condition, Best, Register(rd), Register(rn), imm);
61110                break;
61111              }
61112              case 0x00400000: {
61113                // 0x02700000
61114                if (((instr & 0xf0000000) == 0xf0000000)) {
61115                  UnallocatedA32(instr);
61116                  return;
61117                }
61118                Condition condition((instr >> 28) & 0xf);
61119                unsigned rd = (instr >> 12) & 0xf;
61120                unsigned rn = (instr >> 16) & 0xf;
61121                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61122                // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61123                rsbs(condition, Best, Register(rd), Register(rn), imm);
61124                break;
61125              }
61126            }
61127            break;
61128          }
61129          case 0x00800000: {
61130            // 0x02800000
61131            switch (instr & 0x00400000) {
61132              case 0x00000000: {
61133                // 0x02800000
61134                switch (instr & 0x000d0000) {
61135                  case 0x000d0000: {
61136                    // 0x028d0000
61137                    switch (instr & 0x00020000) {
61138                      case 0x00000000: {
61139                        // 0x028d0000
61140                        if (((instr & 0xf0000000) == 0xf0000000)) {
61141                          UnallocatedA32(instr);
61142                          return;
61143                        }
61144                        Condition condition((instr >> 28) & 0xf);
61145                        unsigned rd = (instr >> 12) & 0xf;
61146                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61147                        // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61148                        add(condition, Best, Register(rd), sp, imm);
61149                        break;
61150                      }
61151                      case 0x00020000: {
61152                        // 0x028f0000
61153                        if (((instr & 0xf0000000) == 0xf0000000)) {
61154                          UnallocatedA32(instr);
61155                          return;
61156                        }
61157                        Condition condition((instr >> 28) & 0xf);
61158                        unsigned rd = (instr >> 12) & 0xf;
61159                        uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61160                        Location location(imm, kA32PcDelta);
61161                        // ADR{<c>}{<q>} <Rd>, <label> ; A1
61162                        adr(condition, Best, Register(rd), &location);
61163                        break;
61164                      }
61165                    }
61166                    break;
61167                  }
61168                  default: {
61169                    if (((instr & 0xf0000000) == 0xf0000000) ||
61170                        ((instr & 0xd0000) == 0xd0000)) {
61171                      UnallocatedA32(instr);
61172                      return;
61173                    }
61174                    Condition condition((instr >> 28) & 0xf);
61175                    unsigned rd = (instr >> 12) & 0xf;
61176                    unsigned rn = (instr >> 16) & 0xf;
61177                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61178                    // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61179                    add(condition, Best, Register(rd), Register(rn), imm);
61180                    break;
61181                  }
61182                }
61183                break;
61184              }
61185              case 0x00400000: {
61186                // 0x02c00000
61187                if (((instr & 0xf0000000) == 0xf0000000)) {
61188                  UnallocatedA32(instr);
61189                  return;
61190                }
61191                Condition condition((instr >> 28) & 0xf);
61192                unsigned rd = (instr >> 12) & 0xf;
61193                unsigned rn = (instr >> 16) & 0xf;
61194                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61195                // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61196                sbc(condition, Best, Register(rd), Register(rn), imm);
61197                break;
61198              }
61199            }
61200            break;
61201          }
61202          case 0x00900000: {
61203            // 0x02900000
61204            switch (instr & 0x00400000) {
61205              case 0x00000000: {
61206                // 0x02900000
61207                switch (instr & 0x000f0000) {
61208                  case 0x000d0000: {
61209                    // 0x029d0000
61210                    if (((instr & 0xf0000000) == 0xf0000000)) {
61211                      UnallocatedA32(instr);
61212                      return;
61213                    }
61214                    Condition condition((instr >> 28) & 0xf);
61215                    unsigned rd = (instr >> 12) & 0xf;
61216                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61217                    // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61218                    adds(condition, Best, Register(rd), sp, imm);
61219                    break;
61220                  }
61221                  default: {
61222                    if (((instr & 0xf0000000) == 0xf0000000) ||
61223                        ((instr & 0xf0000) == 0xd0000)) {
61224                      UnallocatedA32(instr);
61225                      return;
61226                    }
61227                    Condition condition((instr >> 28) & 0xf);
61228                    unsigned rd = (instr >> 12) & 0xf;
61229                    unsigned rn = (instr >> 16) & 0xf;
61230                    uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61231                    // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61232                    adds(condition, Best, Register(rd), Register(rn), imm);
61233                    break;
61234                  }
61235                }
61236                break;
61237              }
61238              case 0x00400000: {
61239                // 0x02d00000
61240                if (((instr & 0xf0000000) == 0xf0000000)) {
61241                  UnallocatedA32(instr);
61242                  return;
61243                }
61244                Condition condition((instr >> 28) & 0xf);
61245                unsigned rd = (instr >> 12) & 0xf;
61246                unsigned rn = (instr >> 16) & 0xf;
61247                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61248                // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61249                sbcs(condition, Best, Register(rd), Register(rn), imm);
61250                break;
61251              }
61252            }
61253            break;
61254          }
61255          case 0x00a00000: {
61256            // 0x02a00000
61257            switch (instr & 0x00400000) {
61258              case 0x00000000: {
61259                // 0x02a00000
61260                if (((instr & 0xf0000000) == 0xf0000000)) {
61261                  UnallocatedA32(instr);
61262                  return;
61263                }
61264                Condition condition((instr >> 28) & 0xf);
61265                unsigned rd = (instr >> 12) & 0xf;
61266                unsigned rn = (instr >> 16) & 0xf;
61267                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61268                // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61269                adc(condition, Best, Register(rd), Register(rn), imm);
61270                break;
61271              }
61272              case 0x00400000: {
61273                // 0x02e00000
61274                if (((instr & 0xf0000000) == 0xf0000000)) {
61275                  UnallocatedA32(instr);
61276                  return;
61277                }
61278                Condition condition((instr >> 28) & 0xf);
61279                unsigned rd = (instr >> 12) & 0xf;
61280                unsigned rn = (instr >> 16) & 0xf;
61281                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61282                // RSC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61283                rsc(condition, Register(rd), Register(rn), imm);
61284                break;
61285              }
61286            }
61287            break;
61288          }
61289          case 0x00b00000: {
61290            // 0x02b00000
61291            switch (instr & 0x00400000) {
61292              case 0x00000000: {
61293                // 0x02b00000
61294                if (((instr & 0xf0000000) == 0xf0000000)) {
61295                  UnallocatedA32(instr);
61296                  return;
61297                }
61298                Condition condition((instr >> 28) & 0xf);
61299                unsigned rd = (instr >> 12) & 0xf;
61300                unsigned rn = (instr >> 16) & 0xf;
61301                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61302                // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61303                adcs(condition, Best, Register(rd), Register(rn), imm);
61304                break;
61305              }
61306              case 0x00400000: {
61307                // 0x02f00000
61308                if (((instr & 0xf0000000) == 0xf0000000)) {
61309                  UnallocatedA32(instr);
61310                  return;
61311                }
61312                Condition condition((instr >> 28) & 0xf);
61313                unsigned rd = (instr >> 12) & 0xf;
61314                unsigned rn = (instr >> 16) & 0xf;
61315                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61316                // RSCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61317                rscs(condition, Register(rd), Register(rn), imm);
61318                break;
61319              }
61320            }
61321            break;
61322          }
61323          case 0x01000000: {
61324            // 0x03000000
61325            switch (instr & 0x00400000) {
61326              case 0x00000000: {
61327                // 0x03000000
61328                if (((instr & 0xf0000000) == 0xf0000000)) {
61329                  UnallocatedA32(instr);
61330                  return;
61331                }
61332                Condition condition((instr >> 28) & 0xf);
61333                unsigned rd = (instr >> 12) & 0xf;
61334                uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
61335                if (!ImmediateA32::IsImmediateA32(imm)) {
61336                  // MOV{<c>}{<q>} <Rd>, #<imm16> ; A2
61337                  mov(condition, Best, Register(rd), imm);
61338                } else {
61339                  // MOVW{<c>}{<q>} <Rd>, #<imm16> ; A2
61340                  movw(condition, Register(rd), imm);
61341                }
61342                break;
61343              }
61344              case 0x00400000: {
61345                // 0x03400000
61346                if (((instr & 0xf0000000) == 0xf0000000)) {
61347                  UnallocatedA32(instr);
61348                  return;
61349                }
61350                Condition condition((instr >> 28) & 0xf);
61351                unsigned rd = (instr >> 12) & 0xf;
61352                uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
61353                // MOVT{<c>}{<q>} <Rd>, #<imm16> ; A1
61354                movt(condition, Register(rd), imm);
61355                break;
61356              }
61357            }
61358            break;
61359          }
61360          case 0x01100000: {
61361            // 0x03100000
61362            switch (instr & 0x00400000) {
61363              case 0x00000000: {
61364                // 0x03100000
61365                if (((instr & 0xf0000000) == 0xf0000000)) {
61366                  UnallocatedA32(instr);
61367                  return;
61368                }
61369                Condition condition((instr >> 28) & 0xf);
61370                unsigned rn = (instr >> 16) & 0xf;
61371                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61372                // TST{<c>}{<q>} <Rn>, #<const> ; A1
61373                tst(condition, Best, Register(rn), imm);
61374                if (((instr & 0xff0f000) != 0x3100000)) {
61375                  UnpredictableA32(instr);
61376                }
61377                break;
61378              }
61379              case 0x00400000: {
61380                // 0x03500000
61381                if (((instr & 0xf0000000) == 0xf0000000)) {
61382                  UnallocatedA32(instr);
61383                  return;
61384                }
61385                Condition condition((instr >> 28) & 0xf);
61386                unsigned rn = (instr >> 16) & 0xf;
61387                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61388                // CMP{<c>}{<q>} <Rn>, #<const> ; A1
61389                cmp(condition, Best, Register(rn), imm);
61390                if (((instr & 0xff0f000) != 0x3500000)) {
61391                  UnpredictableA32(instr);
61392                }
61393                break;
61394              }
61395            }
61396            break;
61397          }
61398          case 0x01200000: {
61399            // 0x03200000
61400            switch (instr & 0x004f0000) {
61401              case 0x00000000: {
61402                // 0x03200000
61403                switch (instr & 0x000000f0) {
61404                  case 0x00000000: {
61405                    // 0x03200000
61406                    switch (instr & 0x0000000f) {
61407                      case 0x00000000: {
61408                        // 0x03200000
61409                        if (((instr & 0xf0000000) == 0xf0000000)) {
61410                          UnallocatedA32(instr);
61411                          return;
61412                        }
61413                        Condition condition((instr >> 28) & 0xf);
61414                        // NOP{<c>}{<q>} ; A1
61415                        nop(condition, Best);
61416                        if (((instr & 0xfffffff) != 0x320f000)) {
61417                          UnpredictableA32(instr);
61418                        }
61419                        break;
61420                      }
61421                      case 0x00000001: {
61422                        // 0x03200001
61423                        if (((instr & 0xf0000000) == 0xf0000000)) {
61424                          UnallocatedA32(instr);
61425                          return;
61426                        }
61427                        Condition condition((instr >> 28) & 0xf);
61428                        // YIELD{<c>}{<q>} ; A1
61429                        yield(condition, Best);
61430                        if (((instr & 0xfffffff) != 0x320f001)) {
61431                          UnpredictableA32(instr);
61432                        }
61433                        break;
61434                      }
61435                      case 0x00000002: {
61436                        // 0x03200002
61437                        if (((instr & 0xf0000000) == 0xf0000000)) {
61438                          UnallocatedA32(instr);
61439                          return;
61440                        }
61441                        UnimplementedA32("WFE", instr);
61442                        break;
61443                      }
61444                      case 0x00000003: {
61445                        // 0x03200003
61446                        if (((instr & 0xf0000000) == 0xf0000000)) {
61447                          UnallocatedA32(instr);
61448                          return;
61449                        }
61450                        UnimplementedA32("WFI", instr);
61451                        break;
61452                      }
61453                      case 0x00000004: {
61454                        // 0x03200004
61455                        if (((instr & 0xf0000000) == 0xf0000000)) {
61456                          UnallocatedA32(instr);
61457                          return;
61458                        }
61459                        UnimplementedA32("SEV", instr);
61460                        break;
61461                      }
61462                      case 0x00000005: {
61463                        // 0x03200005
61464                        if (((instr & 0xf0000000) == 0xf0000000)) {
61465                          UnallocatedA32(instr);
61466                          return;
61467                        }
61468                        UnimplementedA32("SEVL", instr);
61469                        break;
61470                      }
61471                      default:
61472                        UnallocatedA32(instr);
61473                        break;
61474                    }
61475                    break;
61476                  }
61477                  case 0x000000f0: {
61478                    // 0x032000f0
61479                    if (((instr & 0xf0000000) == 0xf0000000)) {
61480                      UnallocatedA32(instr);
61481                      return;
61482                    }
61483                    UnimplementedA32("DBG", instr);
61484                    break;
61485                  }
61486                  default:
61487                    UnallocatedA32(instr);
61488                    break;
61489                }
61490                break;
61491              }
61492              default: {
61493                if (((instr & 0xf0000000) == 0xf0000000) ||
61494                    ((instr & 0x4f0000) == 0x0)) {
61495                  UnallocatedA32(instr);
61496                  return;
61497                }
61498                Condition condition((instr >> 28) & 0xf);
61499                unsigned spec_reg =
61500                    ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
61501                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61502                // MSR{<c>}{<q>} <spec_reg>, #<imm> ; A1
61503                msr(condition, MaskedSpecialRegister(spec_reg), imm);
61504                if (((instr & 0xfb0f000) != 0x320f000)) {
61505                  UnpredictableA32(instr);
61506                }
61507                break;
61508              }
61509            }
61510            break;
61511          }
61512          case 0x01300000: {
61513            // 0x03300000
61514            switch (instr & 0x00400000) {
61515              case 0x00000000: {
61516                // 0x03300000
61517                if (((instr & 0xf0000000) == 0xf0000000)) {
61518                  UnallocatedA32(instr);
61519                  return;
61520                }
61521                Condition condition((instr >> 28) & 0xf);
61522                unsigned rn = (instr >> 16) & 0xf;
61523                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61524                // TEQ{<c>}{<q>} <Rn>, #<const> ; A1
61525                teq(condition, Register(rn), imm);
61526                if (((instr & 0xff0f000) != 0x3300000)) {
61527                  UnpredictableA32(instr);
61528                }
61529                break;
61530              }
61531              case 0x00400000: {
61532                // 0x03700000
61533                if (((instr & 0xf0000000) == 0xf0000000)) {
61534                  UnallocatedA32(instr);
61535                  return;
61536                }
61537                Condition condition((instr >> 28) & 0xf);
61538                unsigned rn = (instr >> 16) & 0xf;
61539                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61540                // CMN{<c>}{<q>} <Rn>, #<const> ; A1
61541                cmn(condition, Best, Register(rn), imm);
61542                if (((instr & 0xff0f000) != 0x3700000)) {
61543                  UnpredictableA32(instr);
61544                }
61545                break;
61546              }
61547            }
61548            break;
61549          }
61550          case 0x01800000: {
61551            // 0x03800000
61552            switch (instr & 0x00400000) {
61553              case 0x00000000: {
61554                // 0x03800000
61555                if (((instr & 0xf0000000) == 0xf0000000)) {
61556                  UnallocatedA32(instr);
61557                  return;
61558                }
61559                Condition condition((instr >> 28) & 0xf);
61560                unsigned rd = (instr >> 12) & 0xf;
61561                unsigned rn = (instr >> 16) & 0xf;
61562                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61563                // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61564                orr(condition, Best, Register(rd), Register(rn), imm);
61565                break;
61566              }
61567              case 0x00400000: {
61568                // 0x03c00000
61569                if (((instr & 0xf0000000) == 0xf0000000)) {
61570                  UnallocatedA32(instr);
61571                  return;
61572                }
61573                Condition condition((instr >> 28) & 0xf);
61574                unsigned rd = (instr >> 12) & 0xf;
61575                unsigned rn = (instr >> 16) & 0xf;
61576                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61577                // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61578                bic(condition, Best, Register(rd), Register(rn), imm);
61579                break;
61580              }
61581            }
61582            break;
61583          }
61584          case 0x01900000: {
61585            // 0x03900000
61586            switch (instr & 0x00400000) {
61587              case 0x00000000: {
61588                // 0x03900000
61589                if (((instr & 0xf0000000) == 0xf0000000)) {
61590                  UnallocatedA32(instr);
61591                  return;
61592                }
61593                Condition condition((instr >> 28) & 0xf);
61594                unsigned rd = (instr >> 12) & 0xf;
61595                unsigned rn = (instr >> 16) & 0xf;
61596                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61597                // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61598                orrs(condition, Best, Register(rd), Register(rn), imm);
61599                break;
61600              }
61601              case 0x00400000: {
61602                // 0x03d00000
61603                if (((instr & 0xf0000000) == 0xf0000000)) {
61604                  UnallocatedA32(instr);
61605                  return;
61606                }
61607                Condition condition((instr >> 28) & 0xf);
61608                unsigned rd = (instr >> 12) & 0xf;
61609                unsigned rn = (instr >> 16) & 0xf;
61610                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61611                // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61612                bics(condition, Best, Register(rd), Register(rn), imm);
61613                break;
61614              }
61615            }
61616            break;
61617          }
61618          case 0x01a00000: {
61619            // 0x03a00000
61620            switch (instr & 0x00400000) {
61621              case 0x00000000: {
61622                // 0x03a00000
61623                if (((instr & 0xf0000000) == 0xf0000000)) {
61624                  UnallocatedA32(instr);
61625                  return;
61626                }
61627                Condition condition((instr >> 28) & 0xf);
61628                unsigned rd = (instr >> 12) & 0xf;
61629                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61630                // MOV{<c>}{<q>} <Rd>, #<const> ; A1
61631                mov(condition, Best, Register(rd), imm);
61632                if (((instr & 0xfff0000) != 0x3a00000)) {
61633                  UnpredictableA32(instr);
61634                }
61635                break;
61636              }
61637              case 0x00400000: {
61638                // 0x03e00000
61639                if (((instr & 0xf0000000) == 0xf0000000)) {
61640                  UnallocatedA32(instr);
61641                  return;
61642                }
61643                Condition condition((instr >> 28) & 0xf);
61644                unsigned rd = (instr >> 12) & 0xf;
61645                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61646                // MVN{<c>}{<q>} <Rd>, #<const> ; A1
61647                mvn(condition, Best, Register(rd), imm);
61648                if (((instr & 0xfff0000) != 0x3e00000)) {
61649                  UnpredictableA32(instr);
61650                }
61651                break;
61652              }
61653            }
61654            break;
61655          }
61656          case 0x01b00000: {
61657            // 0x03b00000
61658            switch (instr & 0x00400000) {
61659              case 0x00000000: {
61660                // 0x03b00000
61661                if (((instr & 0xf0000000) == 0xf0000000)) {
61662                  UnallocatedA32(instr);
61663                  return;
61664                }
61665                Condition condition((instr >> 28) & 0xf);
61666                unsigned rd = (instr >> 12) & 0xf;
61667                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61668                // MOVS{<c>}{<q>} <Rd>, #<const> ; A1
61669                movs(condition, Best, Register(rd), imm);
61670                if (((instr & 0xfff0000) != 0x3b00000)) {
61671                  UnpredictableA32(instr);
61672                }
61673                break;
61674              }
61675              case 0x00400000: {
61676                // 0x03f00000
61677                if (((instr & 0xf0000000) == 0xf0000000)) {
61678                  UnallocatedA32(instr);
61679                  return;
61680                }
61681                Condition condition((instr >> 28) & 0xf);
61682                unsigned rd = (instr >> 12) & 0xf;
61683                uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61684                // MVNS{<c>}{<q>} <Rd>, #<const> ; A1
61685                mvns(condition, Best, Register(rd), imm);
61686                if (((instr & 0xfff0000) != 0x3f00000)) {
61687                  UnpredictableA32(instr);
61688                }
61689                break;
61690              }
61691            }
61692            break;
61693          }
61694        }
61695        break;
61696      }
61697      case 0x04000000: {
61698        // 0x04000000
61699        switch (instr & 0x00500000) {
61700          case 0x00000000: {
61701            // 0x04000000
61702            switch (instr & 0x01200000) {
61703              case 0x00000000: {
61704                // 0x04000000
61705                if (((instr & 0xf0000000) == 0xf0000000)) {
61706                  UnallocatedA32(instr);
61707                  return;
61708                }
61709                Condition condition((instr >> 28) & 0xf);
61710                unsigned rt = (instr >> 12) & 0xf;
61711                unsigned rn = (instr >> 16) & 0xf;
61712                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61713                int32_t offset = instr & 0xfff;
61714                // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
61715                str(condition,
61716                    Best,
61717                    Register(rt),
61718                    MemOperand(Register(rn), sign, offset, PostIndex));
61719                break;
61720              }
61721              case 0x00200000: {
61722                // 0x04200000
61723                if (((instr & 0xf0000000) == 0xf0000000)) {
61724                  UnallocatedA32(instr);
61725                  return;
61726                }
61727                UnimplementedA32("STRT", instr);
61728                break;
61729              }
61730              case 0x01000000: {
61731                // 0x05000000
61732                if (((instr & 0xf0000000) == 0xf0000000)) {
61733                  UnallocatedA32(instr);
61734                  return;
61735                }
61736                Condition condition((instr >> 28) & 0xf);
61737                unsigned rt = (instr >> 12) & 0xf;
61738                unsigned rn = (instr >> 16) & 0xf;
61739                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61740                int32_t offset = instr & 0xfff;
61741                // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
61742                str(condition,
61743                    Best,
61744                    Register(rt),
61745                    MemOperand(Register(rn), sign, offset, Offset));
61746                break;
61747              }
61748              case 0x01200000: {
61749                // 0x05200000
61750                if (((instr & 0xf0000000) == 0xf0000000)) {
61751                  UnallocatedA32(instr);
61752                  return;
61753                }
61754                if (((Uint32((instr >> 23)) & Uint32(0x1)) == Uint32(0x0)) &&
61755                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
61756                    ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
61757                    ((instr & 0xf0000000) != 0xf0000000)) {
61758                  Condition condition((instr >> 28) & 0xf);
61759                  unsigned rt = (instr >> 12) & 0xf;
61760                  // PUSH{<c>}{<q>} <single_register_list> ; A1
61761                  push(condition, Best, Register(rt));
61762                  return;
61763                }
61764                Condition condition((instr >> 28) & 0xf);
61765                unsigned rt = (instr >> 12) & 0xf;
61766                unsigned rn = (instr >> 16) & 0xf;
61767                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61768                int32_t offset = instr & 0xfff;
61769                // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
61770                str(condition,
61771                    Best,
61772                    Register(rt),
61773                    MemOperand(Register(rn), sign, offset, PreIndex));
61774                break;
61775              }
61776            }
61777            break;
61778          }
61779          case 0x00100000: {
61780            // 0x04100000
61781            switch (instr & 0x01200000) {
61782              case 0x00000000: {
61783                // 0x04100000
61784                switch (instr & 0x000f0000) {
61785                  case 0x000f0000: {
61786                    // 0x041f0000
61787                    if (((instr & 0xf0000000) == 0xf0000000) ||
61788                        ((instr & 0x1200000) == 0x200000)) {
61789                      UnallocatedA32(instr);
61790                      return;
61791                    }
61792                    Condition condition((instr >> 28) & 0xf);
61793                    unsigned rt = (instr >> 12) & 0xf;
61794                    uint32_t U = (instr >> 23) & 0x1;
61795                    int32_t imm = instr & 0xfff;
61796                    if (U == 0) imm = -imm;
61797                    bool minus_zero = (imm == 0) && (U == 0);
61798                    Location location(imm, kA32PcDelta);
61799                    // LDR{<c>}{<q>} <Rt>, <label> ; A1
61800                    if (minus_zero) {
61801                      ldr(condition,
61802                          Best,
61803                          Register(rt),
61804                          MemOperand(pc, minus, 0));
61805                    } else {
61806                      ldr(condition, Best, Register(rt), &location);
61807                    }
61808                    if (((instr & 0xf7f0000) != 0x51f0000)) {
61809                      UnpredictableA32(instr);
61810                    }
61811                    break;
61812                  }
61813                  default: {
61814                    if (((instr & 0xf0000000) == 0xf0000000) ||
61815                        ((instr & 0xf0000) == 0xf0000)) {
61816                      UnallocatedA32(instr);
61817                      return;
61818                    }
61819                    if (((Uint32((instr >> 23)) & Uint32(0x1)) ==
61820                         Uint32(0x1)) &&
61821                        ((Uint32((instr >> 16)) & Uint32(0xf)) ==
61822                         Uint32(0xd)) &&
61823                        ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
61824                        ((instr & 0xf0000000) != 0xf0000000)) {
61825                      Condition condition((instr >> 28) & 0xf);
61826                      unsigned rt = (instr >> 12) & 0xf;
61827                      // POP{<c>}{<q>} <single_register_list> ; A1
61828                      pop(condition, Best, Register(rt));
61829                      return;
61830                    }
61831                    Condition condition((instr >> 28) & 0xf);
61832                    unsigned rt = (instr >> 12) & 0xf;
61833                    unsigned rn = (instr >> 16) & 0xf;
61834                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61835                    int32_t offset = instr & 0xfff;
61836                    // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
61837                    ldr(condition,
61838                        Best,
61839                        Register(rt),
61840                        MemOperand(Register(rn), sign, offset, PostIndex));
61841                    break;
61842                  }
61843                }
61844                break;
61845              }
61846              case 0x00200000: {
61847                // 0x04300000
61848                if (((instr & 0xf0000000) == 0xf0000000)) {
61849                  UnallocatedA32(instr);
61850                  return;
61851                }
61852                UnimplementedA32("LDRT", instr);
61853                break;
61854              }
61855              case 0x01000000: {
61856                // 0x05100000
61857                switch (instr & 0x000f0000) {
61858                  case 0x000f0000: {
61859                    // 0x051f0000
61860                    if (((instr & 0xf0000000) == 0xf0000000) ||
61861                        ((instr & 0x1200000) == 0x200000)) {
61862                      UnallocatedA32(instr);
61863                      return;
61864                    }
61865                    Condition condition((instr >> 28) & 0xf);
61866                    unsigned rt = (instr >> 12) & 0xf;
61867                    uint32_t U = (instr >> 23) & 0x1;
61868                    int32_t imm = instr & 0xfff;
61869                    if (U == 0) imm = -imm;
61870                    bool minus_zero = (imm == 0) && (U == 0);
61871                    Location location(imm, kA32PcDelta);
61872                    // LDR{<c>}{<q>} <Rt>, <label> ; A1
61873                    if (minus_zero) {
61874                      ldr(condition,
61875                          Best,
61876                          Register(rt),
61877                          MemOperand(pc, minus, 0));
61878                    } else {
61879                      ldr(condition, Best, Register(rt), &location);
61880                    }
61881                    if (((instr & 0xf7f0000) != 0x51f0000)) {
61882                      UnpredictableA32(instr);
61883                    }
61884                    break;
61885                  }
61886                  default: {
61887                    if (((instr & 0xf0000000) == 0xf0000000) ||
61888                        ((instr & 0xf0000) == 0xf0000)) {
61889                      UnallocatedA32(instr);
61890                      return;
61891                    }
61892                    Condition condition((instr >> 28) & 0xf);
61893                    unsigned rt = (instr >> 12) & 0xf;
61894                    unsigned rn = (instr >> 16) & 0xf;
61895                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61896                    int32_t offset = instr & 0xfff;
61897                    // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
61898                    ldr(condition,
61899                        Best,
61900                        Register(rt),
61901                        MemOperand(Register(rn), sign, offset, Offset));
61902                    break;
61903                  }
61904                }
61905                break;
61906              }
61907              case 0x01200000: {
61908                // 0x05300000
61909                switch (instr & 0x000f0000) {
61910                  case 0x000f0000: {
61911                    // 0x053f0000
61912                    if (((instr & 0xf0000000) == 0xf0000000) ||
61913                        ((instr & 0x1200000) == 0x200000)) {
61914                      UnallocatedA32(instr);
61915                      return;
61916                    }
61917                    Condition condition((instr >> 28) & 0xf);
61918                    unsigned rt = (instr >> 12) & 0xf;
61919                    uint32_t U = (instr >> 23) & 0x1;
61920                    int32_t imm = instr & 0xfff;
61921                    if (U == 0) imm = -imm;
61922                    bool minus_zero = (imm == 0) && (U == 0);
61923                    Location location(imm, kA32PcDelta);
61924                    // LDR{<c>}{<q>} <Rt>, <label> ; A1
61925                    if (minus_zero) {
61926                      ldr(condition,
61927                          Best,
61928                          Register(rt),
61929                          MemOperand(pc, minus, 0));
61930                    } else {
61931                      ldr(condition, Best, Register(rt), &location);
61932                    }
61933                    if (((instr & 0xf7f0000) != 0x51f0000)) {
61934                      UnpredictableA32(instr);
61935                    }
61936                    break;
61937                  }
61938                  default: {
61939                    if (((instr & 0xf0000000) == 0xf0000000) ||
61940                        ((instr & 0xf0000) == 0xf0000)) {
61941                      UnallocatedA32(instr);
61942                      return;
61943                    }
61944                    Condition condition((instr >> 28) & 0xf);
61945                    unsigned rt = (instr >> 12) & 0xf;
61946                    unsigned rn = (instr >> 16) & 0xf;
61947                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61948                    int32_t offset = instr & 0xfff;
61949                    // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
61950                    ldr(condition,
61951                        Best,
61952                        Register(rt),
61953                        MemOperand(Register(rn), sign, offset, PreIndex));
61954                    break;
61955                  }
61956                }
61957                break;
61958              }
61959            }
61960            break;
61961          }
61962          case 0x00400000: {
61963            // 0x04400000
61964            switch (instr & 0x01200000) {
61965              case 0x00000000: {
61966                // 0x04400000
61967                if (((instr & 0xf0000000) == 0xf0000000)) {
61968                  UnallocatedA32(instr);
61969                  return;
61970                }
61971                Condition condition((instr >> 28) & 0xf);
61972                unsigned rt = (instr >> 12) & 0xf;
61973                unsigned rn = (instr >> 16) & 0xf;
61974                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
61975                int32_t offset = instr & 0xfff;
61976                // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
61977                strb(condition,
61978                     Best,
61979                     Register(rt),
61980                     MemOperand(Register(rn), sign, offset, PostIndex));
61981                break;
61982              }
61983              case 0x00200000: {
61984                // 0x04600000
61985                if (((instr & 0xf0000000) == 0xf0000000)) {
61986                  UnallocatedA32(instr);
61987                  return;
61988                }
61989                UnimplementedA32("STRBT", instr);
61990                break;
61991              }
61992              case 0x01000000: {
61993                // 0x05400000
61994                if (((instr & 0xf0000000) == 0xf0000000)) {
61995                  UnallocatedA32(instr);
61996                  return;
61997                }
61998                Condition condition((instr >> 28) & 0xf);
61999                unsigned rt = (instr >> 12) & 0xf;
62000                unsigned rn = (instr >> 16) & 0xf;
62001                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62002                int32_t offset = instr & 0xfff;
62003                // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62004                strb(condition,
62005                     Best,
62006                     Register(rt),
62007                     MemOperand(Register(rn), sign, offset, Offset));
62008                break;
62009              }
62010              case 0x01200000: {
62011                // 0x05600000
62012                if (((instr & 0xf0000000) == 0xf0000000)) {
62013                  UnallocatedA32(instr);
62014                  return;
62015                }
62016                Condition condition((instr >> 28) & 0xf);
62017                unsigned rt = (instr >> 12) & 0xf;
62018                unsigned rn = (instr >> 16) & 0xf;
62019                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62020                int32_t offset = instr & 0xfff;
62021                // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62022                strb(condition,
62023                     Best,
62024                     Register(rt),
62025                     MemOperand(Register(rn), sign, offset, PreIndex));
62026                break;
62027              }
62028            }
62029            break;
62030          }
62031          case 0x00500000: {
62032            // 0x04500000
62033            switch (instr & 0x01200000) {
62034              case 0x00000000: {
62035                // 0x04500000
62036                switch (instr & 0x000f0000) {
62037                  case 0x000f0000: {
62038                    // 0x045f0000
62039                    if (((instr & 0xf0000000) == 0xf0000000) ||
62040                        ((instr & 0x1200000) == 0x200000)) {
62041                      UnallocatedA32(instr);
62042                      return;
62043                    }
62044                    Condition condition((instr >> 28) & 0xf);
62045                    unsigned rt = (instr >> 12) & 0xf;
62046                    uint32_t U = (instr >> 23) & 0x1;
62047                    int32_t imm = instr & 0xfff;
62048                    if (U == 0) imm = -imm;
62049                    bool minus_zero = (imm == 0) && (U == 0);
62050                    Location location(imm, kA32PcDelta);
62051                    // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62052                    if (minus_zero) {
62053                      ldrb(condition,
62054                           Best,
62055                           Register(rt),
62056                           MemOperand(pc, minus, 0));
62057                    } else {
62058                      ldrb(condition, Register(rt), &location);
62059                    }
62060                    if (((instr & 0xf7f0000) != 0x55f0000)) {
62061                      UnpredictableA32(instr);
62062                    }
62063                    break;
62064                  }
62065                  default: {
62066                    if (((instr & 0xf0000000) == 0xf0000000) ||
62067                        ((instr & 0xf0000) == 0xf0000)) {
62068                      UnallocatedA32(instr);
62069                      return;
62070                    }
62071                    Condition condition((instr >> 28) & 0xf);
62072                    unsigned rt = (instr >> 12) & 0xf;
62073                    unsigned rn = (instr >> 16) & 0xf;
62074                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62075                    int32_t offset = instr & 0xfff;
62076                    // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62077                    ldrb(condition,
62078                         Best,
62079                         Register(rt),
62080                         MemOperand(Register(rn), sign, offset, PostIndex));
62081                    break;
62082                  }
62083                }
62084                break;
62085              }
62086              case 0x00200000: {
62087                // 0x04700000
62088                if (((instr & 0xf0000000) == 0xf0000000)) {
62089                  UnallocatedA32(instr);
62090                  return;
62091                }
62092                UnimplementedA32("LDRBT", instr);
62093                break;
62094              }
62095              case 0x01000000: {
62096                // 0x05500000
62097                switch (instr & 0x000f0000) {
62098                  case 0x000f0000: {
62099                    // 0x055f0000
62100                    if (((instr & 0xf0000000) == 0xf0000000) ||
62101                        ((instr & 0x1200000) == 0x200000)) {
62102                      UnallocatedA32(instr);
62103                      return;
62104                    }
62105                    Condition condition((instr >> 28) & 0xf);
62106                    unsigned rt = (instr >> 12) & 0xf;
62107                    uint32_t U = (instr >> 23) & 0x1;
62108                    int32_t imm = instr & 0xfff;
62109                    if (U == 0) imm = -imm;
62110                    bool minus_zero = (imm == 0) && (U == 0);
62111                    Location location(imm, kA32PcDelta);
62112                    // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62113                    if (minus_zero) {
62114                      ldrb(condition,
62115                           Best,
62116                           Register(rt),
62117                           MemOperand(pc, minus, 0));
62118                    } else {
62119                      ldrb(condition, Register(rt), &location);
62120                    }
62121                    if (((instr & 0xf7f0000) != 0x55f0000)) {
62122                      UnpredictableA32(instr);
62123                    }
62124                    break;
62125                  }
62126                  default: {
62127                    if (((instr & 0xf0000000) == 0xf0000000) ||
62128                        ((instr & 0xf0000) == 0xf0000)) {
62129                      UnallocatedA32(instr);
62130                      return;
62131                    }
62132                    Condition condition((instr >> 28) & 0xf);
62133                    unsigned rt = (instr >> 12) & 0xf;
62134                    unsigned rn = (instr >> 16) & 0xf;
62135                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62136                    int32_t offset = instr & 0xfff;
62137                    // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62138                    ldrb(condition,
62139                         Best,
62140                         Register(rt),
62141                         MemOperand(Register(rn), sign, offset, Offset));
62142                    break;
62143                  }
62144                }
62145                break;
62146              }
62147              case 0x01200000: {
62148                // 0x05700000
62149                switch (instr & 0x000f0000) {
62150                  case 0x000f0000: {
62151                    // 0x057f0000
62152                    if (((instr & 0xf0000000) == 0xf0000000) ||
62153                        ((instr & 0x1200000) == 0x200000)) {
62154                      UnallocatedA32(instr);
62155                      return;
62156                    }
62157                    Condition condition((instr >> 28) & 0xf);
62158                    unsigned rt = (instr >> 12) & 0xf;
62159                    uint32_t U = (instr >> 23) & 0x1;
62160                    int32_t imm = instr & 0xfff;
62161                    if (U == 0) imm = -imm;
62162                    bool minus_zero = (imm == 0) && (U == 0);
62163                    Location location(imm, kA32PcDelta);
62164                    // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62165                    if (minus_zero) {
62166                      ldrb(condition,
62167                           Best,
62168                           Register(rt),
62169                           MemOperand(pc, minus, 0));
62170                    } else {
62171                      ldrb(condition, Register(rt), &location);
62172                    }
62173                    if (((instr & 0xf7f0000) != 0x55f0000)) {
62174                      UnpredictableA32(instr);
62175                    }
62176                    break;
62177                  }
62178                  default: {
62179                    if (((instr & 0xf0000000) == 0xf0000000) ||
62180                        ((instr & 0xf0000) == 0xf0000)) {
62181                      UnallocatedA32(instr);
62182                      return;
62183                    }
62184                    Condition condition((instr >> 28) & 0xf);
62185                    unsigned rt = (instr >> 12) & 0xf;
62186                    unsigned rn = (instr >> 16) & 0xf;
62187                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62188                    int32_t offset = instr & 0xfff;
62189                    // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62190                    ldrb(condition,
62191                         Best,
62192                         Register(rt),
62193                         MemOperand(Register(rn), sign, offset, PreIndex));
62194                    break;
62195                  }
62196                }
62197                break;
62198              }
62199            }
62200            break;
62201          }
62202        }
62203        break;
62204      }
62205      case 0x06000000: {
62206        // 0x06000000
62207        switch (instr & 0x01600010) {
62208          case 0x00000000: {
62209            // 0x06000000
62210            switch (instr & 0x00100000) {
62211              case 0x00000000: {
62212                // 0x06000000
62213                if (((instr & 0xf0000000) == 0xf0000000)) {
62214                  UnallocatedA32(instr);
62215                  return;
62216                }
62217                Condition condition((instr >> 28) & 0xf);
62218                unsigned rt = (instr >> 12) & 0xf;
62219                unsigned rn = (instr >> 16) & 0xf;
62220                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62221                unsigned rm = instr & 0xf;
62222                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62223                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
62224                                                    (imm_and_type_ & 0x7c) >>
62225                                                        2);
62226                Shift shift = shift_operand.GetShift();
62227                uint32_t amount = shift_operand.GetAmount();
62228                // STR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
62229                str(condition,
62230                    Best,
62231                    Register(rt),
62232                    MemOperand(Register(rn),
62233                               sign,
62234                               Register(rm),
62235                               shift,
62236                               amount,
62237                               PostIndex));
62238                break;
62239              }
62240              case 0x00100000: {
62241                // 0x06100000
62242                if (((instr & 0xf0000000) == 0xf0000000)) {
62243                  UnallocatedA32(instr);
62244                  return;
62245                }
62246                Condition condition((instr >> 28) & 0xf);
62247                unsigned rt = (instr >> 12) & 0xf;
62248                unsigned rn = (instr >> 16) & 0xf;
62249                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62250                unsigned rm = instr & 0xf;
62251                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62252                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
62253                                                    (imm_and_type_ & 0x7c) >>
62254                                                        2);
62255                Shift shift = shift_operand.GetShift();
62256                uint32_t amount = shift_operand.GetAmount();
62257                // LDR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
62258                ldr(condition,
62259                    Best,
62260                    Register(rt),
62261                    MemOperand(Register(rn),
62262                               sign,
62263                               Register(rm),
62264                               shift,
62265                               amount,
62266                               PostIndex));
62267                break;
62268              }
62269            }
62270            break;
62271          }
62272          case 0x00000010: {
62273            // 0x06000010
62274            switch (instr & 0x00900060) {
62275              case 0x00100000: {
62276                // 0x06100010
62277                switch (instr & 0x00000080) {
62278                  case 0x00000000: {
62279                    // 0x06100010
62280                    if (((instr & 0xf0000000) == 0xf0000000)) {
62281                      UnallocatedA32(instr);
62282                      return;
62283                    }
62284                    Condition condition((instr >> 28) & 0xf);
62285                    unsigned rd = (instr >> 12) & 0xf;
62286                    unsigned rn = (instr >> 16) & 0xf;
62287                    unsigned rm = instr & 0xf;
62288                    // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62289                    sadd16(condition, Register(rd), Register(rn), Register(rm));
62290                    if (((instr & 0xff00ff0) != 0x6100f10)) {
62291                      UnpredictableA32(instr);
62292                    }
62293                    break;
62294                  }
62295                  case 0x00000080: {
62296                    // 0x06100090
62297                    if (((instr & 0xf0000000) == 0xf0000000)) {
62298                      UnallocatedA32(instr);
62299                      return;
62300                    }
62301                    Condition condition((instr >> 28) & 0xf);
62302                    unsigned rd = (instr >> 12) & 0xf;
62303                    unsigned rn = (instr >> 16) & 0xf;
62304                    unsigned rm = instr & 0xf;
62305                    // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62306                    sadd8(condition, Register(rd), Register(rn), Register(rm));
62307                    if (((instr & 0xff00ff0) != 0x6100f90)) {
62308                      UnpredictableA32(instr);
62309                    }
62310                    break;
62311                  }
62312                }
62313                break;
62314              }
62315              case 0x00100020: {
62316                // 0x06100030
62317                if ((instr & 0x00000080) == 0x00000000) {
62318                  if (((instr & 0xf0000000) == 0xf0000000)) {
62319                    UnallocatedA32(instr);
62320                    return;
62321                  }
62322                  Condition condition((instr >> 28) & 0xf);
62323                  unsigned rd = (instr >> 12) & 0xf;
62324                  unsigned rn = (instr >> 16) & 0xf;
62325                  unsigned rm = instr & 0xf;
62326                  // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62327                  sasx(condition, Register(rd), Register(rn), Register(rm));
62328                  if (((instr & 0xff00ff0) != 0x6100f30)) {
62329                    UnpredictableA32(instr);
62330                  }
62331                } else {
62332                  UnallocatedA32(instr);
62333                }
62334                break;
62335              }
62336              case 0x00100040: {
62337                // 0x06100050
62338                if ((instr & 0x00000080) == 0x00000000) {
62339                  if (((instr & 0xf0000000) == 0xf0000000)) {
62340                    UnallocatedA32(instr);
62341                    return;
62342                  }
62343                  Condition condition((instr >> 28) & 0xf);
62344                  unsigned rd = (instr >> 12) & 0xf;
62345                  unsigned rn = (instr >> 16) & 0xf;
62346                  unsigned rm = instr & 0xf;
62347                  // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62348                  ssax(condition, Register(rd), Register(rn), Register(rm));
62349                  if (((instr & 0xff00ff0) != 0x6100f50)) {
62350                    UnpredictableA32(instr);
62351                  }
62352                } else {
62353                  UnallocatedA32(instr);
62354                }
62355                break;
62356              }
62357              case 0x00100060: {
62358                // 0x06100070
62359                switch (instr & 0x00000080) {
62360                  case 0x00000000: {
62361                    // 0x06100070
62362                    if (((instr & 0xf0000000) == 0xf0000000)) {
62363                      UnallocatedA32(instr);
62364                      return;
62365                    }
62366                    Condition condition((instr >> 28) & 0xf);
62367                    unsigned rd = (instr >> 12) & 0xf;
62368                    unsigned rn = (instr >> 16) & 0xf;
62369                    unsigned rm = instr & 0xf;
62370                    // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62371                    ssub16(condition, Register(rd), Register(rn), Register(rm));
62372                    if (((instr & 0xff00ff0) != 0x6100f70)) {
62373                      UnpredictableA32(instr);
62374                    }
62375                    break;
62376                  }
62377                  case 0x00000080: {
62378                    // 0x061000f0
62379                    if (((instr & 0xf0000000) == 0xf0000000)) {
62380                      UnallocatedA32(instr);
62381                      return;
62382                    }
62383                    Condition condition((instr >> 28) & 0xf);
62384                    unsigned rd = (instr >> 12) & 0xf;
62385                    unsigned rn = (instr >> 16) & 0xf;
62386                    unsigned rm = instr & 0xf;
62387                    // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62388                    ssub8(condition, Register(rd), Register(rn), Register(rm));
62389                    if (((instr & 0xff00ff0) != 0x6100ff0)) {
62390                      UnpredictableA32(instr);
62391                    }
62392                    break;
62393                  }
62394                }
62395                break;
62396              }
62397              case 0x00800000: {
62398                // 0x06800010
62399                if (((instr & 0xf0000000) == 0xf0000000)) {
62400                  UnallocatedA32(instr);
62401                  return;
62402                }
62403                Condition condition((instr >> 28) & 0xf);
62404                unsigned rd = (instr >> 12) & 0xf;
62405                unsigned rn = (instr >> 16) & 0xf;
62406                unsigned rm = instr & 0xf;
62407                uint32_t amount = (instr >> 7) & 0x1f;
62408                // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; A1
62409                pkhbt(condition,
62410                      Register(rd),
62411                      Register(rn),
62412                      Operand(Register(rm), LSL, amount));
62413                break;
62414              }
62415              case 0x00800020: {
62416                // 0x06800030
62417                if ((instr & 0x00000080) == 0x00000080) {
62418                  if (((instr & 0xf0000000) == 0xf0000000)) {
62419                    UnallocatedA32(instr);
62420                    return;
62421                  }
62422                  Condition condition((instr >> 28) & 0xf);
62423                  unsigned rd = (instr >> 12) & 0xf;
62424                  unsigned rn = (instr >> 16) & 0xf;
62425                  unsigned rm = instr & 0xf;
62426                  // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62427                  sel(condition, Register(rd), Register(rn), Register(rm));
62428                  if (((instr & 0xff00ff0) != 0x6800fb0)) {
62429                    UnpredictableA32(instr);
62430                  }
62431                } else {
62432                  UnallocatedA32(instr);
62433                }
62434                break;
62435              }
62436              case 0x00800040: {
62437                // 0x06800050
62438                if (((instr & 0xf0000000) == 0xf0000000)) {
62439                  UnallocatedA32(instr);
62440                  return;
62441                }
62442                Condition condition((instr >> 28) & 0xf);
62443                unsigned rd = (instr >> 12) & 0xf;
62444                unsigned rn = (instr >> 16) & 0xf;
62445                unsigned rm = instr & 0xf;
62446                uint32_t amount = (instr >> 7) & 0x1f;
62447                if (amount == 0) amount = 32;
62448                // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; A1
62449                pkhtb(condition,
62450                      Register(rd),
62451                      Register(rn),
62452                      Operand(Register(rm), ASR, amount));
62453                break;
62454              }
62455              case 0x00800060: {
62456                // 0x06800070
62457                switch (instr & 0x00000080) {
62458                  case 0x00000000: {
62459                    // 0x06800070
62460                    switch (instr & 0x000f0000) {
62461                      case 0x000f0000: {
62462                        // 0x068f0070
62463                        if (((instr & 0xf0000000) == 0xf0000000)) {
62464                          UnallocatedA32(instr);
62465                          return;
62466                        }
62467                        Condition condition((instr >> 28) & 0xf);
62468                        unsigned rd = (instr >> 12) & 0xf;
62469                        unsigned rm = instr & 0xf;
62470                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
62471                        // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
62472                        sxtb16(condition,
62473                               Register(rd),
62474                               Operand(Register(rm), ROR, amount));
62475                        if (((instr & 0xfff03f0) != 0x68f0070)) {
62476                          UnpredictableA32(instr);
62477                        }
62478                        break;
62479                      }
62480                      default: {
62481                        if (((instr & 0xf0000000) == 0xf0000000) ||
62482                            ((instr & 0xf0000) == 0xf0000)) {
62483                          UnallocatedA32(instr);
62484                          return;
62485                        }
62486                        Condition condition((instr >> 28) & 0xf);
62487                        unsigned rd = (instr >> 12) & 0xf;
62488                        unsigned rn = (instr >> 16) & 0xf;
62489                        unsigned rm = instr & 0xf;
62490                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
62491                        // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
62492                        sxtab16(condition,
62493                                Register(rd),
62494                                Register(rn),
62495                                Operand(Register(rm), ROR, amount));
62496                        if (((instr & 0xff003f0) != 0x6800070)) {
62497                          UnpredictableA32(instr);
62498                        }
62499                        break;
62500                      }
62501                    }
62502                    break;
62503                  }
62504                  default:
62505                    UnallocatedA32(instr);
62506                    break;
62507                }
62508                break;
62509              }
62510              default:
62511                UnallocatedA32(instr);
62512                break;
62513            }
62514            break;
62515          }
62516          case 0x00200000: {
62517            // 0x06200000
62518            switch (instr & 0x00100000) {
62519              case 0x00000000: {
62520                // 0x06200000
62521                if (((instr & 0xf0000000) == 0xf0000000)) {
62522                  UnallocatedA32(instr);
62523                  return;
62524                }
62525                UnimplementedA32("STRT", instr);
62526                break;
62527              }
62528              case 0x00100000: {
62529                // 0x06300000
62530                if (((instr & 0xf0000000) == 0xf0000000)) {
62531                  UnallocatedA32(instr);
62532                  return;
62533                }
62534                UnimplementedA32("LDRT", instr);
62535                break;
62536              }
62537            }
62538            break;
62539          }
62540          case 0x00200010: {
62541            // 0x06200010
62542            switch (instr & 0x00800060) {
62543              case 0x00000000: {
62544                // 0x06200010
62545                switch (instr & 0x00100080) {
62546                  case 0x00000000: {
62547                    // 0x06200010
62548                    if (((instr & 0xf0000000) == 0xf0000000)) {
62549                      UnallocatedA32(instr);
62550                      return;
62551                    }
62552                    Condition condition((instr >> 28) & 0xf);
62553                    unsigned rd = (instr >> 12) & 0xf;
62554                    unsigned rn = (instr >> 16) & 0xf;
62555                    unsigned rm = instr & 0xf;
62556                    // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62557                    qadd16(condition, Register(rd), Register(rn), Register(rm));
62558                    if (((instr & 0xff00ff0) != 0x6200f10)) {
62559                      UnpredictableA32(instr);
62560                    }
62561                    break;
62562                  }
62563                  case 0x00000080: {
62564                    // 0x06200090
62565                    if (((instr & 0xf0000000) == 0xf0000000)) {
62566                      UnallocatedA32(instr);
62567                      return;
62568                    }
62569                    Condition condition((instr >> 28) & 0xf);
62570                    unsigned rd = (instr >> 12) & 0xf;
62571                    unsigned rn = (instr >> 16) & 0xf;
62572                    unsigned rm = instr & 0xf;
62573                    // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62574                    qadd8(condition, Register(rd), Register(rn), Register(rm));
62575                    if (((instr & 0xff00ff0) != 0x6200f90)) {
62576                      UnpredictableA32(instr);
62577                    }
62578                    break;
62579                  }
62580                  case 0x00100000: {
62581                    // 0x06300010
62582                    if (((instr & 0xf0000000) == 0xf0000000)) {
62583                      UnallocatedA32(instr);
62584                      return;
62585                    }
62586                    Condition condition((instr >> 28) & 0xf);
62587                    unsigned rd = (instr >> 12) & 0xf;
62588                    unsigned rn = (instr >> 16) & 0xf;
62589                    unsigned rm = instr & 0xf;
62590                    // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62591                    shadd16(condition,
62592                            Register(rd),
62593                            Register(rn),
62594                            Register(rm));
62595                    if (((instr & 0xff00ff0) != 0x6300f10)) {
62596                      UnpredictableA32(instr);
62597                    }
62598                    break;
62599                  }
62600                  case 0x00100080: {
62601                    // 0x06300090
62602                    if (((instr & 0xf0000000) == 0xf0000000)) {
62603                      UnallocatedA32(instr);
62604                      return;
62605                    }
62606                    Condition condition((instr >> 28) & 0xf);
62607                    unsigned rd = (instr >> 12) & 0xf;
62608                    unsigned rn = (instr >> 16) & 0xf;
62609                    unsigned rm = instr & 0xf;
62610                    // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62611                    shadd8(condition, Register(rd), Register(rn), Register(rm));
62612                    if (((instr & 0xff00ff0) != 0x6300f90)) {
62613                      UnpredictableA32(instr);
62614                    }
62615                    break;
62616                  }
62617                }
62618                break;
62619              }
62620              case 0x00000020: {
62621                // 0x06200030
62622                switch (instr & 0x00100080) {
62623                  case 0x00000000: {
62624                    // 0x06200030
62625                    if (((instr & 0xf0000000) == 0xf0000000)) {
62626                      UnallocatedA32(instr);
62627                      return;
62628                    }
62629                    Condition condition((instr >> 28) & 0xf);
62630                    unsigned rd = (instr >> 12) & 0xf;
62631                    unsigned rn = (instr >> 16) & 0xf;
62632                    unsigned rm = instr & 0xf;
62633                    // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62634                    qasx(condition, Register(rd), Register(rn), Register(rm));
62635                    if (((instr & 0xff00ff0) != 0x6200f30)) {
62636                      UnpredictableA32(instr);
62637                    }
62638                    break;
62639                  }
62640                  case 0x00100000: {
62641                    // 0x06300030
62642                    if (((instr & 0xf0000000) == 0xf0000000)) {
62643                      UnallocatedA32(instr);
62644                      return;
62645                    }
62646                    Condition condition((instr >> 28) & 0xf);
62647                    unsigned rd = (instr >> 12) & 0xf;
62648                    unsigned rn = (instr >> 16) & 0xf;
62649                    unsigned rm = instr & 0xf;
62650                    // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62651                    shasx(condition, Register(rd), Register(rn), Register(rm));
62652                    if (((instr & 0xff00ff0) != 0x6300f30)) {
62653                      UnpredictableA32(instr);
62654                    }
62655                    break;
62656                  }
62657                  default:
62658                    UnallocatedA32(instr);
62659                    break;
62660                }
62661                break;
62662              }
62663              case 0x00000040: {
62664                // 0x06200050
62665                switch (instr & 0x00100080) {
62666                  case 0x00000000: {
62667                    // 0x06200050
62668                    if (((instr & 0xf0000000) == 0xf0000000)) {
62669                      UnallocatedA32(instr);
62670                      return;
62671                    }
62672                    Condition condition((instr >> 28) & 0xf);
62673                    unsigned rd = (instr >> 12) & 0xf;
62674                    unsigned rn = (instr >> 16) & 0xf;
62675                    unsigned rm = instr & 0xf;
62676                    // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62677                    qsax(condition, Register(rd), Register(rn), Register(rm));
62678                    if (((instr & 0xff00ff0) != 0x6200f50)) {
62679                      UnpredictableA32(instr);
62680                    }
62681                    break;
62682                  }
62683                  case 0x00100000: {
62684                    // 0x06300050
62685                    if (((instr & 0xf0000000) == 0xf0000000)) {
62686                      UnallocatedA32(instr);
62687                      return;
62688                    }
62689                    Condition condition((instr >> 28) & 0xf);
62690                    unsigned rd = (instr >> 12) & 0xf;
62691                    unsigned rn = (instr >> 16) & 0xf;
62692                    unsigned rm = instr & 0xf;
62693                    // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62694                    shsax(condition, Register(rd), Register(rn), Register(rm));
62695                    if (((instr & 0xff00ff0) != 0x6300f50)) {
62696                      UnpredictableA32(instr);
62697                    }
62698                    break;
62699                  }
62700                  default:
62701                    UnallocatedA32(instr);
62702                    break;
62703                }
62704                break;
62705              }
62706              case 0x00000060: {
62707                // 0x06200070
62708                switch (instr & 0x00100080) {
62709                  case 0x00000000: {
62710                    // 0x06200070
62711                    if (((instr & 0xf0000000) == 0xf0000000)) {
62712                      UnallocatedA32(instr);
62713                      return;
62714                    }
62715                    Condition condition((instr >> 28) & 0xf);
62716                    unsigned rd = (instr >> 12) & 0xf;
62717                    unsigned rn = (instr >> 16) & 0xf;
62718                    unsigned rm = instr & 0xf;
62719                    // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62720                    qsub16(condition, Register(rd), Register(rn), Register(rm));
62721                    if (((instr & 0xff00ff0) != 0x6200f70)) {
62722                      UnpredictableA32(instr);
62723                    }
62724                    break;
62725                  }
62726                  case 0x00000080: {
62727                    // 0x062000f0
62728                    if (((instr & 0xf0000000) == 0xf0000000)) {
62729                      UnallocatedA32(instr);
62730                      return;
62731                    }
62732                    Condition condition((instr >> 28) & 0xf);
62733                    unsigned rd = (instr >> 12) & 0xf;
62734                    unsigned rn = (instr >> 16) & 0xf;
62735                    unsigned rm = instr & 0xf;
62736                    // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62737                    qsub8(condition, Register(rd), Register(rn), Register(rm));
62738                    if (((instr & 0xff00ff0) != 0x6200ff0)) {
62739                      UnpredictableA32(instr);
62740                    }
62741                    break;
62742                  }
62743                  case 0x00100000: {
62744                    // 0x06300070
62745                    if (((instr & 0xf0000000) == 0xf0000000)) {
62746                      UnallocatedA32(instr);
62747                      return;
62748                    }
62749                    Condition condition((instr >> 28) & 0xf);
62750                    unsigned rd = (instr >> 12) & 0xf;
62751                    unsigned rn = (instr >> 16) & 0xf;
62752                    unsigned rm = instr & 0xf;
62753                    // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62754                    shsub16(condition,
62755                            Register(rd),
62756                            Register(rn),
62757                            Register(rm));
62758                    if (((instr & 0xff00ff0) != 0x6300f70)) {
62759                      UnpredictableA32(instr);
62760                    }
62761                    break;
62762                  }
62763                  case 0x00100080: {
62764                    // 0x063000f0
62765                    if (((instr & 0xf0000000) == 0xf0000000)) {
62766                      UnallocatedA32(instr);
62767                      return;
62768                    }
62769                    Condition condition((instr >> 28) & 0xf);
62770                    unsigned rd = (instr >> 12) & 0xf;
62771                    unsigned rn = (instr >> 16) & 0xf;
62772                    unsigned rm = instr & 0xf;
62773                    // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62774                    shsub8(condition, Register(rd), Register(rn), Register(rm));
62775                    if (((instr & 0xff00ff0) != 0x6300ff0)) {
62776                      UnpredictableA32(instr);
62777                    }
62778                    break;
62779                  }
62780                }
62781                break;
62782              }
62783              case 0x00800000: {
62784                // 0x06a00010
62785                if (((instr & 0xf0000000) == 0xf0000000)) {
62786                  UnallocatedA32(instr);
62787                  return;
62788                }
62789                Condition condition((instr >> 28) & 0xf);
62790                unsigned rd = (instr >> 12) & 0xf;
62791                uint32_t imm = ((instr >> 16) & 0x1f) + 1;
62792                unsigned rn = instr & 0xf;
62793                uint32_t amount = (instr >> 7) & 0x1f;
62794                // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
62795                ssat(condition,
62796                     Register(rd),
62797                     imm,
62798                     Operand(Register(rn), LSL, amount));
62799                break;
62800              }
62801              case 0x00800020: {
62802                // 0x06a00030
62803                switch (instr & 0x00100080) {
62804                  case 0x00000000: {
62805                    // 0x06a00030
62806                    if (((instr & 0xf0000000) == 0xf0000000)) {
62807                      UnallocatedA32(instr);
62808                      return;
62809                    }
62810                    Condition condition((instr >> 28) & 0xf);
62811                    unsigned rd = (instr >> 12) & 0xf;
62812                    uint32_t imm = ((instr >> 16) & 0xf) + 1;
62813                    unsigned rn = instr & 0xf;
62814                    // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
62815                    ssat16(condition, Register(rd), imm, Register(rn));
62816                    if (((instr & 0xff00ff0) != 0x6a00f30)) {
62817                      UnpredictableA32(instr);
62818                    }
62819                    break;
62820                  }
62821                  case 0x00100000: {
62822                    // 0x06b00030
62823                    if (((instr & 0xf0000000) == 0xf0000000)) {
62824                      UnallocatedA32(instr);
62825                      return;
62826                    }
62827                    Condition condition((instr >> 28) & 0xf);
62828                    unsigned rd = (instr >> 12) & 0xf;
62829                    unsigned rm = instr & 0xf;
62830                    // REV{<c>}{<q>} <Rd>, <Rm> ; A1
62831                    rev(condition, Best, Register(rd), Register(rm));
62832                    if (((instr & 0xfff0ff0) != 0x6bf0f30)) {
62833                      UnpredictableA32(instr);
62834                    }
62835                    break;
62836                  }
62837                  case 0x00100080: {
62838                    // 0x06b000b0
62839                    if (((instr & 0xf0000000) == 0xf0000000)) {
62840                      UnallocatedA32(instr);
62841                      return;
62842                    }
62843                    Condition condition((instr >> 28) & 0xf);
62844                    unsigned rd = (instr >> 12) & 0xf;
62845                    unsigned rm = instr & 0xf;
62846                    // REV16{<c>}{<q>} <Rd>, <Rm> ; A1
62847                    rev16(condition, Best, Register(rd), Register(rm));
62848                    if (((instr & 0xfff0ff0) != 0x6bf0fb0)) {
62849                      UnpredictableA32(instr);
62850                    }
62851                    break;
62852                  }
62853                  default:
62854                    UnallocatedA32(instr);
62855                    break;
62856                }
62857                break;
62858              }
62859              case 0x00800040: {
62860                // 0x06a00050
62861                if (((instr & 0xf0000000) == 0xf0000000)) {
62862                  UnallocatedA32(instr);
62863                  return;
62864                }
62865                Condition condition((instr >> 28) & 0xf);
62866                unsigned rd = (instr >> 12) & 0xf;
62867                uint32_t imm = ((instr >> 16) & 0x1f) + 1;
62868                unsigned rn = instr & 0xf;
62869                uint32_t amount = (instr >> 7) & 0x1f;
62870                if (amount == 0) amount = 32;
62871                // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
62872                ssat(condition,
62873                     Register(rd),
62874                     imm,
62875                     Operand(Register(rn), ASR, amount));
62876                break;
62877              }
62878              case 0x00800060: {
62879                // 0x06a00070
62880                switch (instr & 0x00100080) {
62881                  case 0x00000000: {
62882                    // 0x06a00070
62883                    switch (instr & 0x000f0000) {
62884                      case 0x000f0000: {
62885                        // 0x06af0070
62886                        if (((instr & 0xf0000000) == 0xf0000000)) {
62887                          UnallocatedA32(instr);
62888                          return;
62889                        }
62890                        Condition condition((instr >> 28) & 0xf);
62891                        unsigned rd = (instr >> 12) & 0xf;
62892                        unsigned rm = instr & 0xf;
62893                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
62894                        // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
62895                        sxtb(condition,
62896                             Best,
62897                             Register(rd),
62898                             Operand(Register(rm), ROR, amount));
62899                        if (((instr & 0xfff03f0) != 0x6af0070)) {
62900                          UnpredictableA32(instr);
62901                        }
62902                        break;
62903                      }
62904                      default: {
62905                        if (((instr & 0xf0000000) == 0xf0000000) ||
62906                            ((instr & 0xf0000) == 0xf0000)) {
62907                          UnallocatedA32(instr);
62908                          return;
62909                        }
62910                        Condition condition((instr >> 28) & 0xf);
62911                        unsigned rd = (instr >> 12) & 0xf;
62912                        unsigned rn = (instr >> 16) & 0xf;
62913                        unsigned rm = instr & 0xf;
62914                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
62915                        // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
62916                        sxtab(condition,
62917                              Register(rd),
62918                              Register(rn),
62919                              Operand(Register(rm), ROR, amount));
62920                        if (((instr & 0xff003f0) != 0x6a00070)) {
62921                          UnpredictableA32(instr);
62922                        }
62923                        break;
62924                      }
62925                    }
62926                    break;
62927                  }
62928                  case 0x00100000: {
62929                    // 0x06b00070
62930                    switch (instr & 0x000f0000) {
62931                      case 0x000f0000: {
62932                        // 0x06bf0070
62933                        if (((instr & 0xf0000000) == 0xf0000000)) {
62934                          UnallocatedA32(instr);
62935                          return;
62936                        }
62937                        Condition condition((instr >> 28) & 0xf);
62938                        unsigned rd = (instr >> 12) & 0xf;
62939                        unsigned rm = instr & 0xf;
62940                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
62941                        // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
62942                        sxth(condition,
62943                             Best,
62944                             Register(rd),
62945                             Operand(Register(rm), ROR, amount));
62946                        if (((instr & 0xfff03f0) != 0x6bf0070)) {
62947                          UnpredictableA32(instr);
62948                        }
62949                        break;
62950                      }
62951                      default: {
62952                        if (((instr & 0xf0000000) == 0xf0000000) ||
62953                            ((instr & 0xf0000) == 0xf0000)) {
62954                          UnallocatedA32(instr);
62955                          return;
62956                        }
62957                        Condition condition((instr >> 28) & 0xf);
62958                        unsigned rd = (instr >> 12) & 0xf;
62959                        unsigned rn = (instr >> 16) & 0xf;
62960                        unsigned rm = instr & 0xf;
62961                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
62962                        // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
62963                        sxtah(condition,
62964                              Register(rd),
62965                              Register(rn),
62966                              Operand(Register(rm), ROR, amount));
62967                        if (((instr & 0xff003f0) != 0x6b00070)) {
62968                          UnpredictableA32(instr);
62969                        }
62970                        break;
62971                      }
62972                    }
62973                    break;
62974                  }
62975                  default:
62976                    UnallocatedA32(instr);
62977                    break;
62978                }
62979                break;
62980              }
62981            }
62982            break;
62983          }
62984          case 0x00400000: {
62985            // 0x06400000
62986            switch (instr & 0x00100000) {
62987              case 0x00000000: {
62988                // 0x06400000
62989                if (((instr & 0xf0000000) == 0xf0000000)) {
62990                  UnallocatedA32(instr);
62991                  return;
62992                }
62993                Condition condition((instr >> 28) & 0xf);
62994                unsigned rt = (instr >> 12) & 0xf;
62995                unsigned rn = (instr >> 16) & 0xf;
62996                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62997                unsigned rm = instr & 0xf;
62998                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62999                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63000                                                    (imm_and_type_ & 0x7c) >>
63001                                                        2);
63002                Shift shift = shift_operand.GetShift();
63003                uint32_t amount = shift_operand.GetAmount();
63004                // STRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
63005                strb(condition,
63006                     Best,
63007                     Register(rt),
63008                     MemOperand(Register(rn),
63009                                sign,
63010                                Register(rm),
63011                                shift,
63012                                amount,
63013                                PostIndex));
63014                break;
63015              }
63016              case 0x00100000: {
63017                // 0x06500000
63018                if (((instr & 0xf0000000) == 0xf0000000)) {
63019                  UnallocatedA32(instr);
63020                  return;
63021                }
63022                Condition condition((instr >> 28) & 0xf);
63023                unsigned rt = (instr >> 12) & 0xf;
63024                unsigned rn = (instr >> 16) & 0xf;
63025                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63026                unsigned rm = instr & 0xf;
63027                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63028                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63029                                                    (imm_and_type_ & 0x7c) >>
63030                                                        2);
63031                Shift shift = shift_operand.GetShift();
63032                uint32_t amount = shift_operand.GetAmount();
63033                // LDRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
63034                ldrb(condition,
63035                     Best,
63036                     Register(rt),
63037                     MemOperand(Register(rn),
63038                                sign,
63039                                Register(rm),
63040                                shift,
63041                                amount,
63042                                PostIndex));
63043                break;
63044              }
63045            }
63046            break;
63047          }
63048          case 0x00400010: {
63049            // 0x06400010
63050            switch (instr & 0x009000e0) {
63051              case 0x00100000: {
63052                // 0x06500010
63053                if (((instr & 0xf0000000) == 0xf0000000)) {
63054                  UnallocatedA32(instr);
63055                  return;
63056                }
63057                Condition condition((instr >> 28) & 0xf);
63058                unsigned rd = (instr >> 12) & 0xf;
63059                unsigned rn = (instr >> 16) & 0xf;
63060                unsigned rm = instr & 0xf;
63061                // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63062                uadd16(condition, Register(rd), Register(rn), Register(rm));
63063                if (((instr & 0xff00ff0) != 0x6500f10)) {
63064                  UnpredictableA32(instr);
63065                }
63066                break;
63067              }
63068              case 0x00100020: {
63069                // 0x06500030
63070                if (((instr & 0xf0000000) == 0xf0000000)) {
63071                  UnallocatedA32(instr);
63072                  return;
63073                }
63074                Condition condition((instr >> 28) & 0xf);
63075                unsigned rd = (instr >> 12) & 0xf;
63076                unsigned rn = (instr >> 16) & 0xf;
63077                unsigned rm = instr & 0xf;
63078                // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63079                uasx(condition, Register(rd), Register(rn), Register(rm));
63080                if (((instr & 0xff00ff0) != 0x6500f30)) {
63081                  UnpredictableA32(instr);
63082                }
63083                break;
63084              }
63085              case 0x00100040: {
63086                // 0x06500050
63087                if (((instr & 0xf0000000) == 0xf0000000)) {
63088                  UnallocatedA32(instr);
63089                  return;
63090                }
63091                Condition condition((instr >> 28) & 0xf);
63092                unsigned rd = (instr >> 12) & 0xf;
63093                unsigned rn = (instr >> 16) & 0xf;
63094                unsigned rm = instr & 0xf;
63095                // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63096                usax(condition, Register(rd), Register(rn), Register(rm));
63097                if (((instr & 0xff00ff0) != 0x6500f50)) {
63098                  UnpredictableA32(instr);
63099                }
63100                break;
63101              }
63102              case 0x00100060: {
63103                // 0x06500070
63104                if (((instr & 0xf0000000) == 0xf0000000)) {
63105                  UnallocatedA32(instr);
63106                  return;
63107                }
63108                Condition condition((instr >> 28) & 0xf);
63109                unsigned rd = (instr >> 12) & 0xf;
63110                unsigned rn = (instr >> 16) & 0xf;
63111                unsigned rm = instr & 0xf;
63112                // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63113                usub16(condition, Register(rd), Register(rn), Register(rm));
63114                if (((instr & 0xff00ff0) != 0x6500f70)) {
63115                  UnpredictableA32(instr);
63116                }
63117                break;
63118              }
63119              case 0x00100080: {
63120                // 0x06500090
63121                if (((instr & 0xf0000000) == 0xf0000000)) {
63122                  UnallocatedA32(instr);
63123                  return;
63124                }
63125                Condition condition((instr >> 28) & 0xf);
63126                unsigned rd = (instr >> 12) & 0xf;
63127                unsigned rn = (instr >> 16) & 0xf;
63128                unsigned rm = instr & 0xf;
63129                // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63130                uadd8(condition, Register(rd), Register(rn), Register(rm));
63131                if (((instr & 0xff00ff0) != 0x6500f90)) {
63132                  UnpredictableA32(instr);
63133                }
63134                break;
63135              }
63136              case 0x001000e0: {
63137                // 0x065000f0
63138                if (((instr & 0xf0000000) == 0xf0000000)) {
63139                  UnallocatedA32(instr);
63140                  return;
63141                }
63142                Condition condition((instr >> 28) & 0xf);
63143                unsigned rd = (instr >> 12) & 0xf;
63144                unsigned rn = (instr >> 16) & 0xf;
63145                unsigned rm = instr & 0xf;
63146                // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63147                usub8(condition, Register(rd), Register(rn), Register(rm));
63148                if (((instr & 0xff00ff0) != 0x6500ff0)) {
63149                  UnpredictableA32(instr);
63150                }
63151                break;
63152              }
63153              case 0x00800060: {
63154                // 0x06c00070
63155                switch (instr & 0x000f0000) {
63156                  case 0x000f0000: {
63157                    // 0x06cf0070
63158                    if (((instr & 0xf0000000) == 0xf0000000)) {
63159                      UnallocatedA32(instr);
63160                      return;
63161                    }
63162                    Condition condition((instr >> 28) & 0xf);
63163                    unsigned rd = (instr >> 12) & 0xf;
63164                    unsigned rm = instr & 0xf;
63165                    uint32_t amount = ((instr >> 10) & 0x3) * 8;
63166                    // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63167                    uxtb16(condition,
63168                           Register(rd),
63169                           Operand(Register(rm), ROR, amount));
63170                    if (((instr & 0xfff03f0) != 0x6cf0070)) {
63171                      UnpredictableA32(instr);
63172                    }
63173                    break;
63174                  }
63175                  default: {
63176                    if (((instr & 0xf0000000) == 0xf0000000) ||
63177                        ((instr & 0xf0000) == 0xf0000)) {
63178                      UnallocatedA32(instr);
63179                      return;
63180                    }
63181                    Condition condition((instr >> 28) & 0xf);
63182                    unsigned rd = (instr >> 12) & 0xf;
63183                    unsigned rn = (instr >> 16) & 0xf;
63184                    unsigned rm = instr & 0xf;
63185                    uint32_t amount = ((instr >> 10) & 0x3) * 8;
63186                    // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63187                    uxtab16(condition,
63188                            Register(rd),
63189                            Register(rn),
63190                            Operand(Register(rm), ROR, amount));
63191                    if (((instr & 0xff003f0) != 0x6c00070)) {
63192                      UnpredictableA32(instr);
63193                    }
63194                    break;
63195                  }
63196                }
63197                break;
63198              }
63199              default:
63200                UnallocatedA32(instr);
63201                break;
63202            }
63203            break;
63204          }
63205          case 0x00600000: {
63206            // 0x06600000
63207            switch (instr & 0x00100000) {
63208              case 0x00000000: {
63209                // 0x06600000
63210                if (((instr & 0xf0000000) == 0xf0000000)) {
63211                  UnallocatedA32(instr);
63212                  return;
63213                }
63214                UnimplementedA32("STRBT", instr);
63215                break;
63216              }
63217              case 0x00100000: {
63218                // 0x06700000
63219                if (((instr & 0xf0000000) == 0xf0000000)) {
63220                  UnallocatedA32(instr);
63221                  return;
63222                }
63223                UnimplementedA32("LDRBT", instr);
63224                break;
63225              }
63226            }
63227            break;
63228          }
63229          case 0x00600010: {
63230            // 0x06600010
63231            switch (instr & 0x00800060) {
63232              case 0x00000000: {
63233                // 0x06600010
63234                switch (instr & 0x00100080) {
63235                  case 0x00000000: {
63236                    // 0x06600010
63237                    if (((instr & 0xf0000000) == 0xf0000000)) {
63238                      UnallocatedA32(instr);
63239                      return;
63240                    }
63241                    Condition condition((instr >> 28) & 0xf);
63242                    unsigned rd = (instr >> 12) & 0xf;
63243                    unsigned rn = (instr >> 16) & 0xf;
63244                    unsigned rm = instr & 0xf;
63245                    // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63246                    uqadd16(condition,
63247                            Register(rd),
63248                            Register(rn),
63249                            Register(rm));
63250                    if (((instr & 0xff00ff0) != 0x6600f10)) {
63251                      UnpredictableA32(instr);
63252                    }
63253                    break;
63254                  }
63255                  case 0x00000080: {
63256                    // 0x06600090
63257                    if (((instr & 0xf0000000) == 0xf0000000)) {
63258                      UnallocatedA32(instr);
63259                      return;
63260                    }
63261                    Condition condition((instr >> 28) & 0xf);
63262                    unsigned rd = (instr >> 12) & 0xf;
63263                    unsigned rn = (instr >> 16) & 0xf;
63264                    unsigned rm = instr & 0xf;
63265                    // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63266                    uqadd8(condition, Register(rd), Register(rn), Register(rm));
63267                    if (((instr & 0xff00ff0) != 0x6600f90)) {
63268                      UnpredictableA32(instr);
63269                    }
63270                    break;
63271                  }
63272                  case 0x00100000: {
63273                    // 0x06700010
63274                    if (((instr & 0xf0000000) == 0xf0000000)) {
63275                      UnallocatedA32(instr);
63276                      return;
63277                    }
63278                    Condition condition((instr >> 28) & 0xf);
63279                    unsigned rd = (instr >> 12) & 0xf;
63280                    unsigned rn = (instr >> 16) & 0xf;
63281                    unsigned rm = instr & 0xf;
63282                    // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63283                    uhadd16(condition,
63284                            Register(rd),
63285                            Register(rn),
63286                            Register(rm));
63287                    if (((instr & 0xff00ff0) != 0x6700f10)) {
63288                      UnpredictableA32(instr);
63289                    }
63290                    break;
63291                  }
63292                  case 0x00100080: {
63293                    // 0x06700090
63294                    if (((instr & 0xf0000000) == 0xf0000000)) {
63295                      UnallocatedA32(instr);
63296                      return;
63297                    }
63298                    Condition condition((instr >> 28) & 0xf);
63299                    unsigned rd = (instr >> 12) & 0xf;
63300                    unsigned rn = (instr >> 16) & 0xf;
63301                    unsigned rm = instr & 0xf;
63302                    // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63303                    uhadd8(condition, Register(rd), Register(rn), Register(rm));
63304                    if (((instr & 0xff00ff0) != 0x6700f90)) {
63305                      UnpredictableA32(instr);
63306                    }
63307                    break;
63308                  }
63309                }
63310                break;
63311              }
63312              case 0x00000020: {
63313                // 0x06600030
63314                switch (instr & 0x00100080) {
63315                  case 0x00000000: {
63316                    // 0x06600030
63317                    if (((instr & 0xf0000000) == 0xf0000000)) {
63318                      UnallocatedA32(instr);
63319                      return;
63320                    }
63321                    Condition condition((instr >> 28) & 0xf);
63322                    unsigned rd = (instr >> 12) & 0xf;
63323                    unsigned rn = (instr >> 16) & 0xf;
63324                    unsigned rm = instr & 0xf;
63325                    // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63326                    uqasx(condition, Register(rd), Register(rn), Register(rm));
63327                    if (((instr & 0xff00ff0) != 0x6600f30)) {
63328                      UnpredictableA32(instr);
63329                    }
63330                    break;
63331                  }
63332                  case 0x00100000: {
63333                    // 0x06700030
63334                    if (((instr & 0xf0000000) == 0xf0000000)) {
63335                      UnallocatedA32(instr);
63336                      return;
63337                    }
63338                    Condition condition((instr >> 28) & 0xf);
63339                    unsigned rd = (instr >> 12) & 0xf;
63340                    unsigned rn = (instr >> 16) & 0xf;
63341                    unsigned rm = instr & 0xf;
63342                    // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63343                    uhasx(condition, Register(rd), Register(rn), Register(rm));
63344                    if (((instr & 0xff00ff0) != 0x6700f30)) {
63345                      UnpredictableA32(instr);
63346                    }
63347                    break;
63348                  }
63349                  default:
63350                    UnallocatedA32(instr);
63351                    break;
63352                }
63353                break;
63354              }
63355              case 0x00000040: {
63356                // 0x06600050
63357                switch (instr & 0x00100080) {
63358                  case 0x00000000: {
63359                    // 0x06600050
63360                    if (((instr & 0xf0000000) == 0xf0000000)) {
63361                      UnallocatedA32(instr);
63362                      return;
63363                    }
63364                    Condition condition((instr >> 28) & 0xf);
63365                    unsigned rd = (instr >> 12) & 0xf;
63366                    unsigned rn = (instr >> 16) & 0xf;
63367                    unsigned rm = instr & 0xf;
63368                    // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63369                    uqsax(condition, Register(rd), Register(rn), Register(rm));
63370                    if (((instr & 0xff00ff0) != 0x6600f50)) {
63371                      UnpredictableA32(instr);
63372                    }
63373                    break;
63374                  }
63375                  case 0x00100000: {
63376                    // 0x06700050
63377                    if (((instr & 0xf0000000) == 0xf0000000)) {
63378                      UnallocatedA32(instr);
63379                      return;
63380                    }
63381                    Condition condition((instr >> 28) & 0xf);
63382                    unsigned rd = (instr >> 12) & 0xf;
63383                    unsigned rn = (instr >> 16) & 0xf;
63384                    unsigned rm = instr & 0xf;
63385                    // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63386                    uhsax(condition, Register(rd), Register(rn), Register(rm));
63387                    if (((instr & 0xff00ff0) != 0x6700f50)) {
63388                      UnpredictableA32(instr);
63389                    }
63390                    break;
63391                  }
63392                  default:
63393                    UnallocatedA32(instr);
63394                    break;
63395                }
63396                break;
63397              }
63398              case 0x00000060: {
63399                // 0x06600070
63400                switch (instr & 0x00100080) {
63401                  case 0x00000000: {
63402                    // 0x06600070
63403                    if (((instr & 0xf0000000) == 0xf0000000)) {
63404                      UnallocatedA32(instr);
63405                      return;
63406                    }
63407                    Condition condition((instr >> 28) & 0xf);
63408                    unsigned rd = (instr >> 12) & 0xf;
63409                    unsigned rn = (instr >> 16) & 0xf;
63410                    unsigned rm = instr & 0xf;
63411                    // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63412                    uqsub16(condition,
63413                            Register(rd),
63414                            Register(rn),
63415                            Register(rm));
63416                    if (((instr & 0xff00ff0) != 0x6600f70)) {
63417                      UnpredictableA32(instr);
63418                    }
63419                    break;
63420                  }
63421                  case 0x00000080: {
63422                    // 0x066000f0
63423                    if (((instr & 0xf0000000) == 0xf0000000)) {
63424                      UnallocatedA32(instr);
63425                      return;
63426                    }
63427                    Condition condition((instr >> 28) & 0xf);
63428                    unsigned rd = (instr >> 12) & 0xf;
63429                    unsigned rn = (instr >> 16) & 0xf;
63430                    unsigned rm = instr & 0xf;
63431                    // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63432                    uqsub8(condition, Register(rd), Register(rn), Register(rm));
63433                    if (((instr & 0xff00ff0) != 0x6600ff0)) {
63434                      UnpredictableA32(instr);
63435                    }
63436                    break;
63437                  }
63438                  case 0x00100000: {
63439                    // 0x06700070
63440                    if (((instr & 0xf0000000) == 0xf0000000)) {
63441                      UnallocatedA32(instr);
63442                      return;
63443                    }
63444                    Condition condition((instr >> 28) & 0xf);
63445                    unsigned rd = (instr >> 12) & 0xf;
63446                    unsigned rn = (instr >> 16) & 0xf;
63447                    unsigned rm = instr & 0xf;
63448                    // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63449                    uhsub16(condition,
63450                            Register(rd),
63451                            Register(rn),
63452                            Register(rm));
63453                    if (((instr & 0xff00ff0) != 0x6700f70)) {
63454                      UnpredictableA32(instr);
63455                    }
63456                    break;
63457                  }
63458                  case 0x00100080: {
63459                    // 0x067000f0
63460                    if (((instr & 0xf0000000) == 0xf0000000)) {
63461                      UnallocatedA32(instr);
63462                      return;
63463                    }
63464                    Condition condition((instr >> 28) & 0xf);
63465                    unsigned rd = (instr >> 12) & 0xf;
63466                    unsigned rn = (instr >> 16) & 0xf;
63467                    unsigned rm = instr & 0xf;
63468                    // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63469                    uhsub8(condition, Register(rd), Register(rn), Register(rm));
63470                    if (((instr & 0xff00ff0) != 0x6700ff0)) {
63471                      UnpredictableA32(instr);
63472                    }
63473                    break;
63474                  }
63475                }
63476                break;
63477              }
63478              case 0x00800000: {
63479                // 0x06e00010
63480                if (((instr & 0xf0000000) == 0xf0000000)) {
63481                  UnallocatedA32(instr);
63482                  return;
63483                }
63484                Condition condition((instr >> 28) & 0xf);
63485                unsigned rd = (instr >> 12) & 0xf;
63486                uint32_t imm = (instr >> 16) & 0x1f;
63487                unsigned rn = instr & 0xf;
63488                uint32_t amount = (instr >> 7) & 0x1f;
63489                // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
63490                usat(condition,
63491                     Register(rd),
63492                     imm,
63493                     Operand(Register(rn), LSL, amount));
63494                break;
63495              }
63496              case 0x00800020: {
63497                // 0x06e00030
63498                switch (instr & 0x00100080) {
63499                  case 0x00000000: {
63500                    // 0x06e00030
63501                    if (((instr & 0xf0000000) == 0xf0000000)) {
63502                      UnallocatedA32(instr);
63503                      return;
63504                    }
63505                    Condition condition((instr >> 28) & 0xf);
63506                    unsigned rd = (instr >> 12) & 0xf;
63507                    uint32_t imm = (instr >> 16) & 0xf;
63508                    unsigned rn = instr & 0xf;
63509                    // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
63510                    usat16(condition, Register(rd), imm, Register(rn));
63511                    if (((instr & 0xff00ff0) != 0x6e00f30)) {
63512                      UnpredictableA32(instr);
63513                    }
63514                    break;
63515                  }
63516                  case 0x00100000: {
63517                    // 0x06f00030
63518                    if (((instr & 0xf0000000) == 0xf0000000)) {
63519                      UnallocatedA32(instr);
63520                      return;
63521                    }
63522                    Condition condition((instr >> 28) & 0xf);
63523                    unsigned rd = (instr >> 12) & 0xf;
63524                    unsigned rm = instr & 0xf;
63525                    // RBIT{<c>}{<q>} <Rd>, <Rm> ; A1
63526                    rbit(condition, Register(rd), Register(rm));
63527                    if (((instr & 0xfff0ff0) != 0x6ff0f30)) {
63528                      UnpredictableA32(instr);
63529                    }
63530                    break;
63531                  }
63532                  case 0x00100080: {
63533                    // 0x06f000b0
63534                    if (((instr & 0xf0000000) == 0xf0000000)) {
63535                      UnallocatedA32(instr);
63536                      return;
63537                    }
63538                    Condition condition((instr >> 28) & 0xf);
63539                    unsigned rd = (instr >> 12) & 0xf;
63540                    unsigned rm = instr & 0xf;
63541                    // REVSH{<c>}{<q>} <Rd>, <Rm> ; A1
63542                    revsh(condition, Best, Register(rd), Register(rm));
63543                    if (((instr & 0xfff0ff0) != 0x6ff0fb0)) {
63544                      UnpredictableA32(instr);
63545                    }
63546                    break;
63547                  }
63548                  default:
63549                    UnallocatedA32(instr);
63550                    break;
63551                }
63552                break;
63553              }
63554              case 0x00800040: {
63555                // 0x06e00050
63556                if (((instr & 0xf0000000) == 0xf0000000)) {
63557                  UnallocatedA32(instr);
63558                  return;
63559                }
63560                Condition condition((instr >> 28) & 0xf);
63561                unsigned rd = (instr >> 12) & 0xf;
63562                uint32_t imm = (instr >> 16) & 0x1f;
63563                unsigned rn = instr & 0xf;
63564                uint32_t amount = (instr >> 7) & 0x1f;
63565                if (amount == 0) amount = 32;
63566                // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
63567                usat(condition,
63568                     Register(rd),
63569                     imm,
63570                     Operand(Register(rn), ASR, amount));
63571                break;
63572              }
63573              case 0x00800060: {
63574                // 0x06e00070
63575                switch (instr & 0x00100080) {
63576                  case 0x00000000: {
63577                    // 0x06e00070
63578                    switch (instr & 0x000f0000) {
63579                      case 0x000f0000: {
63580                        // 0x06ef0070
63581                        if (((instr & 0xf0000000) == 0xf0000000)) {
63582                          UnallocatedA32(instr);
63583                          return;
63584                        }
63585                        Condition condition((instr >> 28) & 0xf);
63586                        unsigned rd = (instr >> 12) & 0xf;
63587                        unsigned rm = instr & 0xf;
63588                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63589                        // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63590                        uxtb(condition,
63591                             Best,
63592                             Register(rd),
63593                             Operand(Register(rm), ROR, amount));
63594                        if (((instr & 0xfff03f0) != 0x6ef0070)) {
63595                          UnpredictableA32(instr);
63596                        }
63597                        break;
63598                      }
63599                      default: {
63600                        if (((instr & 0xf0000000) == 0xf0000000) ||
63601                            ((instr & 0xf0000) == 0xf0000)) {
63602                          UnallocatedA32(instr);
63603                          return;
63604                        }
63605                        Condition condition((instr >> 28) & 0xf);
63606                        unsigned rd = (instr >> 12) & 0xf;
63607                        unsigned rn = (instr >> 16) & 0xf;
63608                        unsigned rm = instr & 0xf;
63609                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63610                        // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63611                        uxtab(condition,
63612                              Register(rd),
63613                              Register(rn),
63614                              Operand(Register(rm), ROR, amount));
63615                        if (((instr & 0xff003f0) != 0x6e00070)) {
63616                          UnpredictableA32(instr);
63617                        }
63618                        break;
63619                      }
63620                    }
63621                    break;
63622                  }
63623                  case 0x00100000: {
63624                    // 0x06f00070
63625                    switch (instr & 0x000f0000) {
63626                      case 0x000f0000: {
63627                        // 0x06ff0070
63628                        if (((instr & 0xf0000000) == 0xf0000000)) {
63629                          UnallocatedA32(instr);
63630                          return;
63631                        }
63632                        Condition condition((instr >> 28) & 0xf);
63633                        unsigned rd = (instr >> 12) & 0xf;
63634                        unsigned rm = instr & 0xf;
63635                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63636                        // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63637                        uxth(condition,
63638                             Best,
63639                             Register(rd),
63640                             Operand(Register(rm), ROR, amount));
63641                        if (((instr & 0xfff03f0) != 0x6ff0070)) {
63642                          UnpredictableA32(instr);
63643                        }
63644                        break;
63645                      }
63646                      default: {
63647                        if (((instr & 0xf0000000) == 0xf0000000) ||
63648                            ((instr & 0xf0000) == 0xf0000)) {
63649                          UnallocatedA32(instr);
63650                          return;
63651                        }
63652                        Condition condition((instr >> 28) & 0xf);
63653                        unsigned rd = (instr >> 12) & 0xf;
63654                        unsigned rn = (instr >> 16) & 0xf;
63655                        unsigned rm = instr & 0xf;
63656                        uint32_t amount = ((instr >> 10) & 0x3) * 8;
63657                        // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63658                        uxtah(condition,
63659                              Register(rd),
63660                              Register(rn),
63661                              Operand(Register(rm), ROR, amount));
63662                        if (((instr & 0xff003f0) != 0x6f00070)) {
63663                          UnpredictableA32(instr);
63664                        }
63665                        break;
63666                      }
63667                    }
63668                    break;
63669                  }
63670                  default:
63671                    UnallocatedA32(instr);
63672                    break;
63673                }
63674                break;
63675              }
63676            }
63677            break;
63678          }
63679          case 0x01000000: {
63680            // 0x07000000
63681            switch (instr & 0x00100000) {
63682              case 0x00000000: {
63683                // 0x07000000
63684                if (((instr & 0xf0000000) == 0xf0000000)) {
63685                  UnallocatedA32(instr);
63686                  return;
63687                }
63688                Condition condition((instr >> 28) & 0xf);
63689                unsigned rt = (instr >> 12) & 0xf;
63690                unsigned rn = (instr >> 16) & 0xf;
63691                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63692                unsigned rm = instr & 0xf;
63693                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63694                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63695                                                    (imm_and_type_ & 0x7c) >>
63696                                                        2);
63697                Shift shift = shift_operand.GetShift();
63698                uint32_t amount = shift_operand.GetAmount();
63699                AddrMode addrmode = Offset;
63700                // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
63701                str(condition,
63702                    Best,
63703                    Register(rt),
63704                    MemOperand(Register(rn),
63705                               sign,
63706                               Register(rm),
63707                               shift,
63708                               amount,
63709                               addrmode));
63710                break;
63711              }
63712              case 0x00100000: {
63713                // 0x07100000
63714                if (((instr & 0xf0000000) == 0xf0000000)) {
63715                  UnallocatedA32(instr);
63716                  return;
63717                }
63718                Condition condition((instr >> 28) & 0xf);
63719                unsigned rt = (instr >> 12) & 0xf;
63720                unsigned rn = (instr >> 16) & 0xf;
63721                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63722                unsigned rm = instr & 0xf;
63723                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63724                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63725                                                    (imm_and_type_ & 0x7c) >>
63726                                                        2);
63727                Shift shift = shift_operand.GetShift();
63728                uint32_t amount = shift_operand.GetAmount();
63729                AddrMode addrmode = Offset;
63730                // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
63731                ldr(condition,
63732                    Best,
63733                    Register(rt),
63734                    MemOperand(Register(rn),
63735                               sign,
63736                               Register(rm),
63737                               shift,
63738                               amount,
63739                               addrmode));
63740                break;
63741              }
63742            }
63743            break;
63744          }
63745          case 0x01000010: {
63746            // 0x07000010
63747            switch (instr & 0x009000e0) {
63748              case 0x00000000: {
63749                // 0x07000010
63750                switch (instr & 0x0000f000) {
63751                  case 0x0000f000: {
63752                    // 0x0700f010
63753                    if (((instr & 0xf0000000) == 0xf0000000)) {
63754                      UnallocatedA32(instr);
63755                      return;
63756                    }
63757                    Condition condition((instr >> 28) & 0xf);
63758                    unsigned rd = (instr >> 16) & 0xf;
63759                    unsigned rn = instr & 0xf;
63760                    unsigned rm = (instr >> 8) & 0xf;
63761                    // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63762                    smuad(condition, Register(rd), Register(rn), Register(rm));
63763                    break;
63764                  }
63765                  default: {
63766                    if (((instr & 0xf0000000) == 0xf0000000) ||
63767                        ((instr & 0xf000) == 0xf000)) {
63768                      UnallocatedA32(instr);
63769                      return;
63770                    }
63771                    Condition condition((instr >> 28) & 0xf);
63772                    unsigned rd = (instr >> 16) & 0xf;
63773                    unsigned rn = instr & 0xf;
63774                    unsigned rm = (instr >> 8) & 0xf;
63775                    unsigned ra = (instr >> 12) & 0xf;
63776                    // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63777                    smlad(condition,
63778                          Register(rd),
63779                          Register(rn),
63780                          Register(rm),
63781                          Register(ra));
63782                    break;
63783                  }
63784                }
63785                break;
63786              }
63787              case 0x00000020: {
63788                // 0x07000030
63789                switch (instr & 0x0000f000) {
63790                  case 0x0000f000: {
63791                    // 0x0700f030
63792                    if (((instr & 0xf0000000) == 0xf0000000)) {
63793                      UnallocatedA32(instr);
63794                      return;
63795                    }
63796                    Condition condition((instr >> 28) & 0xf);
63797                    unsigned rd = (instr >> 16) & 0xf;
63798                    unsigned rn = instr & 0xf;
63799                    unsigned rm = (instr >> 8) & 0xf;
63800                    // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63801                    smuadx(condition, Register(rd), Register(rn), Register(rm));
63802                    break;
63803                  }
63804                  default: {
63805                    if (((instr & 0xf0000000) == 0xf0000000) ||
63806                        ((instr & 0xf000) == 0xf000)) {
63807                      UnallocatedA32(instr);
63808                      return;
63809                    }
63810                    Condition condition((instr >> 28) & 0xf);
63811                    unsigned rd = (instr >> 16) & 0xf;
63812                    unsigned rn = instr & 0xf;
63813                    unsigned rm = (instr >> 8) & 0xf;
63814                    unsigned ra = (instr >> 12) & 0xf;
63815                    // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63816                    smladx(condition,
63817                           Register(rd),
63818                           Register(rn),
63819                           Register(rm),
63820                           Register(ra));
63821                    break;
63822                  }
63823                }
63824                break;
63825              }
63826              case 0x00000040: {
63827                // 0x07000050
63828                switch (instr & 0x0000f000) {
63829                  case 0x0000f000: {
63830                    // 0x0700f050
63831                    if (((instr & 0xf0000000) == 0xf0000000)) {
63832                      UnallocatedA32(instr);
63833                      return;
63834                    }
63835                    Condition condition((instr >> 28) & 0xf);
63836                    unsigned rd = (instr >> 16) & 0xf;
63837                    unsigned rn = instr & 0xf;
63838                    unsigned rm = (instr >> 8) & 0xf;
63839                    // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63840                    smusd(condition, Register(rd), Register(rn), Register(rm));
63841                    break;
63842                  }
63843                  default: {
63844                    if (((instr & 0xf0000000) == 0xf0000000) ||
63845                        ((instr & 0xf000) == 0xf000)) {
63846                      UnallocatedA32(instr);
63847                      return;
63848                    }
63849                    Condition condition((instr >> 28) & 0xf);
63850                    unsigned rd = (instr >> 16) & 0xf;
63851                    unsigned rn = instr & 0xf;
63852                    unsigned rm = (instr >> 8) & 0xf;
63853                    unsigned ra = (instr >> 12) & 0xf;
63854                    // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63855                    smlsd(condition,
63856                          Register(rd),
63857                          Register(rn),
63858                          Register(rm),
63859                          Register(ra));
63860                    break;
63861                  }
63862                }
63863                break;
63864              }
63865              case 0x00000060: {
63866                // 0x07000070
63867                switch (instr & 0x0000f000) {
63868                  case 0x0000f000: {
63869                    // 0x0700f070
63870                    if (((instr & 0xf0000000) == 0xf0000000)) {
63871                      UnallocatedA32(instr);
63872                      return;
63873                    }
63874                    Condition condition((instr >> 28) & 0xf);
63875                    unsigned rd = (instr >> 16) & 0xf;
63876                    unsigned rn = instr & 0xf;
63877                    unsigned rm = (instr >> 8) & 0xf;
63878                    // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63879                    smusdx(condition, Register(rd), Register(rn), Register(rm));
63880                    break;
63881                  }
63882                  default: {
63883                    if (((instr & 0xf0000000) == 0xf0000000) ||
63884                        ((instr & 0xf000) == 0xf000)) {
63885                      UnallocatedA32(instr);
63886                      return;
63887                    }
63888                    Condition condition((instr >> 28) & 0xf);
63889                    unsigned rd = (instr >> 16) & 0xf;
63890                    unsigned rn = instr & 0xf;
63891                    unsigned rm = (instr >> 8) & 0xf;
63892                    unsigned ra = (instr >> 12) & 0xf;
63893                    // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63894                    smlsdx(condition,
63895                           Register(rd),
63896                           Register(rn),
63897                           Register(rm),
63898                           Register(ra));
63899                    break;
63900                  }
63901                }
63902                break;
63903              }
63904              case 0x00100000: {
63905                // 0x07100010
63906                if (((instr & 0xf0000000) == 0xf0000000)) {
63907                  UnallocatedA32(instr);
63908                  return;
63909                }
63910                Condition condition((instr >> 28) & 0xf);
63911                unsigned rd = (instr >> 16) & 0xf;
63912                unsigned rn = instr & 0xf;
63913                unsigned rm = (instr >> 8) & 0xf;
63914                // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63915                sdiv(condition, Register(rd), Register(rn), Register(rm));
63916                if (((instr & 0xff0f0f0) != 0x710f010)) {
63917                  UnpredictableA32(instr);
63918                }
63919                break;
63920              }
63921              case 0x00800000: {
63922                // 0x07800010
63923                switch (instr & 0x0000f000) {
63924                  case 0x0000f000: {
63925                    // 0x0780f010
63926                    if (((instr & 0xf0000000) == 0xf0000000)) {
63927                      UnallocatedA32(instr);
63928                      return;
63929                    }
63930                    Condition condition((instr >> 28) & 0xf);
63931                    unsigned rd = (instr >> 16) & 0xf;
63932                    unsigned rn = instr & 0xf;
63933                    unsigned rm = (instr >> 8) & 0xf;
63934                    // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63935                    usad8(condition, Register(rd), Register(rn), Register(rm));
63936                    break;
63937                  }
63938                  default: {
63939                    if (((instr & 0xf0000000) == 0xf0000000) ||
63940                        ((instr & 0xf000) == 0xf000)) {
63941                      UnallocatedA32(instr);
63942                      return;
63943                    }
63944                    Condition condition((instr >> 28) & 0xf);
63945                    unsigned rd = (instr >> 16) & 0xf;
63946                    unsigned rn = instr & 0xf;
63947                    unsigned rm = (instr >> 8) & 0xf;
63948                    unsigned ra = (instr >> 12) & 0xf;
63949                    // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
63950                    usada8(condition,
63951                           Register(rd),
63952                           Register(rn),
63953                           Register(rm),
63954                           Register(ra));
63955                    break;
63956                  }
63957                }
63958                break;
63959              }
63960              default:
63961                UnallocatedA32(instr);
63962                break;
63963            }
63964            break;
63965          }
63966          case 0x01200000: {
63967            // 0x07200000
63968            switch (instr & 0x00100000) {
63969              case 0x00000000: {
63970                // 0x07200000
63971                if (((instr & 0xf0000000) == 0xf0000000)) {
63972                  UnallocatedA32(instr);
63973                  return;
63974                }
63975                Condition condition((instr >> 28) & 0xf);
63976                unsigned rt = (instr >> 12) & 0xf;
63977                unsigned rn = (instr >> 16) & 0xf;
63978                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63979                unsigned rm = instr & 0xf;
63980                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63981                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63982                                                    (imm_and_type_ & 0x7c) >>
63983                                                        2);
63984                Shift shift = shift_operand.GetShift();
63985                uint32_t amount = shift_operand.GetAmount();
63986                AddrMode addrmode = PreIndex;
63987                // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
63988                str(condition,
63989                    Best,
63990                    Register(rt),
63991                    MemOperand(Register(rn),
63992                               sign,
63993                               Register(rm),
63994                               shift,
63995                               amount,
63996                               addrmode));
63997                break;
63998              }
63999              case 0x00100000: {
64000                // 0x07300000
64001                if (((instr & 0xf0000000) == 0xf0000000)) {
64002                  UnallocatedA32(instr);
64003                  return;
64004                }
64005                Condition condition((instr >> 28) & 0xf);
64006                unsigned rt = (instr >> 12) & 0xf;
64007                unsigned rn = (instr >> 16) & 0xf;
64008                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64009                unsigned rm = instr & 0xf;
64010                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64011                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64012                                                    (imm_and_type_ & 0x7c) >>
64013                                                        2);
64014                Shift shift = shift_operand.GetShift();
64015                uint32_t amount = shift_operand.GetAmount();
64016                AddrMode addrmode = PreIndex;
64017                // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64018                ldr(condition,
64019                    Best,
64020                    Register(rt),
64021                    MemOperand(Register(rn),
64022                               sign,
64023                               Register(rm),
64024                               shift,
64025                               amount,
64026                               addrmode));
64027                break;
64028              }
64029            }
64030            break;
64031          }
64032          case 0x01200010: {
64033            // 0x07200010
64034            switch (instr & 0x00800060) {
64035              case 0x00000000: {
64036                // 0x07200010
64037                if ((instr & 0x00100080) == 0x00100000) {
64038                  if (((instr & 0xf0000000) == 0xf0000000)) {
64039                    UnallocatedA32(instr);
64040                    return;
64041                  }
64042                  Condition condition((instr >> 28) & 0xf);
64043                  unsigned rd = (instr >> 16) & 0xf;
64044                  unsigned rn = instr & 0xf;
64045                  unsigned rm = (instr >> 8) & 0xf;
64046                  // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64047                  udiv(condition, Register(rd), Register(rn), Register(rm));
64048                  if (((instr & 0xff0f0f0) != 0x730f010)) {
64049                    UnpredictableA32(instr);
64050                  }
64051                } else {
64052                  UnallocatedA32(instr);
64053                }
64054                break;
64055              }
64056              case 0x00800040: {
64057                // 0x07a00050
64058                if (((instr & 0xf0000000) == 0xf0000000)) {
64059                  UnallocatedA32(instr);
64060                  return;
64061                }
64062                Condition condition((instr >> 28) & 0xf);
64063                unsigned rd = (instr >> 12) & 0xf;
64064                unsigned rn = instr & 0xf;
64065                uint32_t lsb = (instr >> 7) & 0x1f;
64066                uint32_t widthm1 = (instr >> 16) & 0x1f;
64067                uint32_t width = widthm1 + 1;
64068                // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64069                sbfx(condition, Register(rd), Register(rn), lsb, width);
64070                break;
64071              }
64072              default:
64073                UnallocatedA32(instr);
64074                break;
64075            }
64076            break;
64077          }
64078          case 0x01400000: {
64079            // 0x07400000
64080            switch (instr & 0x00100000) {
64081              case 0x00000000: {
64082                // 0x07400000
64083                if (((instr & 0xf0000000) == 0xf0000000)) {
64084                  UnallocatedA32(instr);
64085                  return;
64086                }
64087                Condition condition((instr >> 28) & 0xf);
64088                unsigned rt = (instr >> 12) & 0xf;
64089                unsigned rn = (instr >> 16) & 0xf;
64090                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64091                unsigned rm = instr & 0xf;
64092                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64093                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64094                                                    (imm_and_type_ & 0x7c) >>
64095                                                        2);
64096                Shift shift = shift_operand.GetShift();
64097                uint32_t amount = shift_operand.GetAmount();
64098                AddrMode addrmode = Offset;
64099                // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64100                strb(condition,
64101                     Best,
64102                     Register(rt),
64103                     MemOperand(Register(rn),
64104                                sign,
64105                                Register(rm),
64106                                shift,
64107                                amount,
64108                                addrmode));
64109                break;
64110              }
64111              case 0x00100000: {
64112                // 0x07500000
64113                if (((instr & 0xf0000000) == 0xf0000000)) {
64114                  UnallocatedA32(instr);
64115                  return;
64116                }
64117                Condition condition((instr >> 28) & 0xf);
64118                unsigned rt = (instr >> 12) & 0xf;
64119                unsigned rn = (instr >> 16) & 0xf;
64120                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64121                unsigned rm = instr & 0xf;
64122                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64123                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64124                                                    (imm_and_type_ & 0x7c) >>
64125                                                        2);
64126                Shift shift = shift_operand.GetShift();
64127                uint32_t amount = shift_operand.GetAmount();
64128                AddrMode addrmode = Offset;
64129                // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64130                ldrb(condition,
64131                     Best,
64132                     Register(rt),
64133                     MemOperand(Register(rn),
64134                                sign,
64135                                Register(rm),
64136                                shift,
64137                                amount,
64138                                addrmode));
64139                break;
64140              }
64141            }
64142            break;
64143          }
64144          case 0x01400010: {
64145            // 0x07400010
64146            switch (instr & 0x00800060) {
64147              case 0x00000000: {
64148                // 0x07400010
64149                switch (instr & 0x00100080) {
64150                  case 0x00000000: {
64151                    // 0x07400010
64152                    if (((instr & 0xf0000000) == 0xf0000000)) {
64153                      UnallocatedA32(instr);
64154                      return;
64155                    }
64156                    Condition condition((instr >> 28) & 0xf);
64157                    unsigned rdlo = (instr >> 12) & 0xf;
64158                    unsigned rdhi = (instr >> 16) & 0xf;
64159                    unsigned rn = instr & 0xf;
64160                    unsigned rm = (instr >> 8) & 0xf;
64161                    // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64162                    smlald(condition,
64163                           Register(rdlo),
64164                           Register(rdhi),
64165                           Register(rn),
64166                           Register(rm));
64167                    break;
64168                  }
64169                  case 0x00100000: {
64170                    // 0x07500010
64171                    switch (instr & 0x0000f000) {
64172                      case 0x0000f000: {
64173                        // 0x0750f010
64174                        if (((instr & 0xf0000000) == 0xf0000000)) {
64175                          UnallocatedA32(instr);
64176                          return;
64177                        }
64178                        Condition condition((instr >> 28) & 0xf);
64179                        unsigned rd = (instr >> 16) & 0xf;
64180                        unsigned rn = instr & 0xf;
64181                        unsigned rm = (instr >> 8) & 0xf;
64182                        // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64183                        smmul(condition,
64184                              Register(rd),
64185                              Register(rn),
64186                              Register(rm));
64187                        break;
64188                      }
64189                      default: {
64190                        if (((instr & 0xf0000000) == 0xf0000000) ||
64191                            ((instr & 0xf000) == 0xf000)) {
64192                          UnallocatedA32(instr);
64193                          return;
64194                        }
64195                        Condition condition((instr >> 28) & 0xf);
64196                        unsigned rd = (instr >> 16) & 0xf;
64197                        unsigned rn = instr & 0xf;
64198                        unsigned rm = (instr >> 8) & 0xf;
64199                        unsigned ra = (instr >> 12) & 0xf;
64200                        // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64201                        smmla(condition,
64202                              Register(rd),
64203                              Register(rn),
64204                              Register(rm),
64205                              Register(ra));
64206                        break;
64207                      }
64208                    }
64209                    break;
64210                  }
64211                  default:
64212                    UnallocatedA32(instr);
64213                    break;
64214                }
64215                break;
64216              }
64217              case 0x00000020: {
64218                // 0x07400030
64219                switch (instr & 0x00100080) {
64220                  case 0x00000000: {
64221                    // 0x07400030
64222                    if (((instr & 0xf0000000) == 0xf0000000)) {
64223                      UnallocatedA32(instr);
64224                      return;
64225                    }
64226                    Condition condition((instr >> 28) & 0xf);
64227                    unsigned rdlo = (instr >> 12) & 0xf;
64228                    unsigned rdhi = (instr >> 16) & 0xf;
64229                    unsigned rn = instr & 0xf;
64230                    unsigned rm = (instr >> 8) & 0xf;
64231                    // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64232                    smlaldx(condition,
64233                            Register(rdlo),
64234                            Register(rdhi),
64235                            Register(rn),
64236                            Register(rm));
64237                    break;
64238                  }
64239                  case 0x00100000: {
64240                    // 0x07500030
64241                    switch (instr & 0x0000f000) {
64242                      case 0x0000f000: {
64243                        // 0x0750f030
64244                        if (((instr & 0xf0000000) == 0xf0000000)) {
64245                          UnallocatedA32(instr);
64246                          return;
64247                        }
64248                        Condition condition((instr >> 28) & 0xf);
64249                        unsigned rd = (instr >> 16) & 0xf;
64250                        unsigned rn = instr & 0xf;
64251                        unsigned rm = (instr >> 8) & 0xf;
64252                        // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64253                        smmulr(condition,
64254                               Register(rd),
64255                               Register(rn),
64256                               Register(rm));
64257                        break;
64258                      }
64259                      default: {
64260                        if (((instr & 0xf0000000) == 0xf0000000) ||
64261                            ((instr & 0xf000) == 0xf000)) {
64262                          UnallocatedA32(instr);
64263                          return;
64264                        }
64265                        Condition condition((instr >> 28) & 0xf);
64266                        unsigned rd = (instr >> 16) & 0xf;
64267                        unsigned rn = instr & 0xf;
64268                        unsigned rm = (instr >> 8) & 0xf;
64269                        unsigned ra = (instr >> 12) & 0xf;
64270                        // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64271                        smmlar(condition,
64272                               Register(rd),
64273                               Register(rn),
64274                               Register(rm),
64275                               Register(ra));
64276                        break;
64277                      }
64278                    }
64279                    break;
64280                  }
64281                  default:
64282                    UnallocatedA32(instr);
64283                    break;
64284                }
64285                break;
64286              }
64287              case 0x00000040: {
64288                // 0x07400050
64289                switch (instr & 0x00100080) {
64290                  case 0x00000000: {
64291                    // 0x07400050
64292                    if (((instr & 0xf0000000) == 0xf0000000)) {
64293                      UnallocatedA32(instr);
64294                      return;
64295                    }
64296                    Condition condition((instr >> 28) & 0xf);
64297                    unsigned rdlo = (instr >> 12) & 0xf;
64298                    unsigned rdhi = (instr >> 16) & 0xf;
64299                    unsigned rn = instr & 0xf;
64300                    unsigned rm = (instr >> 8) & 0xf;
64301                    // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64302                    smlsld(condition,
64303                           Register(rdlo),
64304                           Register(rdhi),
64305                           Register(rn),
64306                           Register(rm));
64307                    break;
64308                  }
64309                  case 0x00100080: {
64310                    // 0x075000d0
64311                    if (((instr & 0xf0000000) == 0xf0000000)) {
64312                      UnallocatedA32(instr);
64313                      return;
64314                    }
64315                    Condition condition((instr >> 28) & 0xf);
64316                    unsigned rd = (instr >> 16) & 0xf;
64317                    unsigned rn = instr & 0xf;
64318                    unsigned rm = (instr >> 8) & 0xf;
64319                    unsigned ra = (instr >> 12) & 0xf;
64320                    // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64321                    smmls(condition,
64322                          Register(rd),
64323                          Register(rn),
64324                          Register(rm),
64325                          Register(ra));
64326                    break;
64327                  }
64328                  default:
64329                    UnallocatedA32(instr);
64330                    break;
64331                }
64332                break;
64333              }
64334              case 0x00000060: {
64335                // 0x07400070
64336                switch (instr & 0x00100080) {
64337                  case 0x00000000: {
64338                    // 0x07400070
64339                    if (((instr & 0xf0000000) == 0xf0000000)) {
64340                      UnallocatedA32(instr);
64341                      return;
64342                    }
64343                    Condition condition((instr >> 28) & 0xf);
64344                    unsigned rdlo = (instr >> 12) & 0xf;
64345                    unsigned rdhi = (instr >> 16) & 0xf;
64346                    unsigned rn = instr & 0xf;
64347                    unsigned rm = (instr >> 8) & 0xf;
64348                    // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64349                    smlsldx(condition,
64350                            Register(rdlo),
64351                            Register(rdhi),
64352                            Register(rn),
64353                            Register(rm));
64354                    break;
64355                  }
64356                  case 0x00100080: {
64357                    // 0x075000f0
64358                    if (((instr & 0xf0000000) == 0xf0000000)) {
64359                      UnallocatedA32(instr);
64360                      return;
64361                    }
64362                    Condition condition((instr >> 28) & 0xf);
64363                    unsigned rd = (instr >> 16) & 0xf;
64364                    unsigned rn = instr & 0xf;
64365                    unsigned rm = (instr >> 8) & 0xf;
64366                    unsigned ra = (instr >> 12) & 0xf;
64367                    // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64368                    smmlsr(condition,
64369                           Register(rd),
64370                           Register(rn),
64371                           Register(rm),
64372                           Register(ra));
64373                    break;
64374                  }
64375                  default:
64376                    UnallocatedA32(instr);
64377                    break;
64378                }
64379                break;
64380              }
64381              case 0x00800000: {
64382                // 0x07c00010
64383                switch (instr & 0x0000000f) {
64384                  case 0x0000000f: {
64385                    // 0x07c0001f
64386                    if (((instr & 0xf0000000) == 0xf0000000)) {
64387                      UnallocatedA32(instr);
64388                      return;
64389                    }
64390                    Condition condition((instr >> 28) & 0xf);
64391                    unsigned rd = (instr >> 12) & 0xf;
64392                    uint32_t lsb = (instr >> 7) & 0x1f;
64393                    uint32_t msb = (instr >> 16) & 0x1f;
64394                    uint32_t width = msb - lsb + 1;
64395                    // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; A1
64396                    bfc(condition, Register(rd), lsb, width);
64397                    break;
64398                  }
64399                  default: {
64400                    if (((instr & 0xf0000000) == 0xf0000000) ||
64401                        ((instr & 0xf) == 0xf)) {
64402                      UnallocatedA32(instr);
64403                      return;
64404                    }
64405                    Condition condition((instr >> 28) & 0xf);
64406                    unsigned rd = (instr >> 12) & 0xf;
64407                    unsigned rn = instr & 0xf;
64408                    uint32_t lsb = (instr >> 7) & 0x1f;
64409                    uint32_t msb = (instr >> 16) & 0x1f;
64410                    uint32_t width = msb - lsb + 1;
64411                    // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64412                    bfi(condition, Register(rd), Register(rn), lsb, width);
64413                    break;
64414                  }
64415                }
64416                break;
64417              }
64418              default:
64419                UnallocatedA32(instr);
64420                break;
64421            }
64422            break;
64423          }
64424          case 0x01600000: {
64425            // 0x07600000
64426            switch (instr & 0x00100000) {
64427              case 0x00000000: {
64428                // 0x07600000
64429                if (((instr & 0xf0000000) == 0xf0000000)) {
64430                  UnallocatedA32(instr);
64431                  return;
64432                }
64433                Condition condition((instr >> 28) & 0xf);
64434                unsigned rt = (instr >> 12) & 0xf;
64435                unsigned rn = (instr >> 16) & 0xf;
64436                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64437                unsigned rm = instr & 0xf;
64438                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64439                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64440                                                    (imm_and_type_ & 0x7c) >>
64441                                                        2);
64442                Shift shift = shift_operand.GetShift();
64443                uint32_t amount = shift_operand.GetAmount();
64444                AddrMode addrmode = PreIndex;
64445                // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64446                strb(condition,
64447                     Best,
64448                     Register(rt),
64449                     MemOperand(Register(rn),
64450                                sign,
64451                                Register(rm),
64452                                shift,
64453                                amount,
64454                                addrmode));
64455                break;
64456              }
64457              case 0x00100000: {
64458                // 0x07700000
64459                if (((instr & 0xf0000000) == 0xf0000000)) {
64460                  UnallocatedA32(instr);
64461                  return;
64462                }
64463                Condition condition((instr >> 28) & 0xf);
64464                unsigned rt = (instr >> 12) & 0xf;
64465                unsigned rn = (instr >> 16) & 0xf;
64466                Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64467                unsigned rm = instr & 0xf;
64468                uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64469                ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64470                                                    (imm_and_type_ & 0x7c) >>
64471                                                        2);
64472                Shift shift = shift_operand.GetShift();
64473                uint32_t amount = shift_operand.GetAmount();
64474                AddrMode addrmode = PreIndex;
64475                // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64476                ldrb(condition,
64477                     Best,
64478                     Register(rt),
64479                     MemOperand(Register(rn),
64480                                sign,
64481                                Register(rm),
64482                                shift,
64483                                amount,
64484                                addrmode));
64485                break;
64486              }
64487            }
64488            break;
64489          }
64490          case 0x01600010: {
64491            // 0x07600010
64492            switch (instr & 0x00800060) {
64493              case 0x00800040: {
64494                // 0x07e00050
64495                if (((instr & 0xf0000000) == 0xf0000000)) {
64496                  UnallocatedA32(instr);
64497                  return;
64498                }
64499                Condition condition((instr >> 28) & 0xf);
64500                unsigned rd = (instr >> 12) & 0xf;
64501                unsigned rn = instr & 0xf;
64502                uint32_t lsb = (instr >> 7) & 0x1f;
64503                uint32_t widthm1 = (instr >> 16) & 0x1f;
64504                uint32_t width = widthm1 + 1;
64505                // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64506                ubfx(condition, Register(rd), Register(rn), lsb, width);
64507                break;
64508              }
64509              case 0x00800060: {
64510                // 0x07e00070
64511                if ((instr & 0xf0100080) == 0xe0100080) {
64512                  uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
64513                  // UDF{<c>}{<q>} {#}<imm> ; A1
64514                  udf(al, Best, imm);
64515                } else {
64516                  UnallocatedA32(instr);
64517                }
64518                break;
64519              }
64520              default:
64521                UnallocatedA32(instr);
64522                break;
64523            }
64524            break;
64525          }
64526        }
64527        break;
64528      }
64529      case 0x08000000: {
64530        // 0x08000000
64531        switch (instr & 0x00500000) {
64532          case 0x00000000: {
64533            // 0x08000000
64534            switch (instr & 0x01800000) {
64535              case 0x00000000: {
64536                // 0x08000000
64537                if (((instr & 0xf0000000) == 0xf0000000)) {
64538                  UnallocatedA32(instr);
64539                  return;
64540                }
64541                Condition condition((instr >> 28) & 0xf);
64542                unsigned rn = (instr >> 16) & 0xf;
64543                WriteBack write_back((instr >> 21) & 0x1);
64544                RegisterList registers((instr & 0xffff));
64545                // STMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
64546                stmda(condition, Register(rn), write_back, registers);
64547                break;
64548              }
64549              case 0x00800000: {
64550                // 0x08800000
64551                if (((instr & 0xf0000000) == 0xf0000000)) {
64552                  UnallocatedA32(instr);
64553                  return;
64554                }
64555                Condition condition((instr >> 28) & 0xf);
64556                unsigned rn = (instr >> 16) & 0xf;
64557                WriteBack write_back((instr >> 21) & 0x1);
64558                RegisterList registers((instr & 0xffff));
64559                // STM{<c>}{<q>} <Rn>{!}, <registers> ; A1
64560                stm(condition, Best, Register(rn), write_back, registers);
64561                break;
64562              }
64563              case 0x01000000: {
64564                // 0x09000000
64565                if (((instr & 0xf0000000) == 0xf0000000)) {
64566                  UnallocatedA32(instr);
64567                  return;
64568                }
64569                if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
64570                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
64571                    ((instr & 0xf0000000) != 0xf0000000) &&
64572                    (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
64573                  Condition condition((instr >> 28) & 0xf);
64574                  RegisterList registers((instr & 0xffff));
64575                  // PUSH{<c>}{<q>} <registers> ; A1
64576                  push(condition, Best, registers);
64577                  return;
64578                }
64579                Condition condition((instr >> 28) & 0xf);
64580                unsigned rn = (instr >> 16) & 0xf;
64581                WriteBack write_back((instr >> 21) & 0x1);
64582                RegisterList registers((instr & 0xffff));
64583                // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
64584                stmdb(condition, Best, Register(rn), write_back, registers);
64585                break;
64586              }
64587              case 0x01800000: {
64588                // 0x09800000
64589                if (((instr & 0xf0000000) == 0xf0000000)) {
64590                  UnallocatedA32(instr);
64591                  return;
64592                }
64593                Condition condition((instr >> 28) & 0xf);
64594                unsigned rn = (instr >> 16) & 0xf;
64595                WriteBack write_back((instr >> 21) & 0x1);
64596                RegisterList registers((instr & 0xffff));
64597                // STMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
64598                stmib(condition, Register(rn), write_back, registers);
64599                break;
64600              }
64601            }
64602            break;
64603          }
64604          case 0x00100000: {
64605            // 0x08100000
64606            switch (instr & 0x01800000) {
64607              case 0x00000000: {
64608                // 0x08100000
64609                if (((instr & 0xf0000000) == 0xf0000000)) {
64610                  UnallocatedA32(instr);
64611                  return;
64612                }
64613                Condition condition((instr >> 28) & 0xf);
64614                unsigned rn = (instr >> 16) & 0xf;
64615                WriteBack write_back((instr >> 21) & 0x1);
64616                RegisterList registers((instr & 0xffff));
64617                // LDMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
64618                ldmda(condition, Register(rn), write_back, registers);
64619                break;
64620              }
64621              case 0x00800000: {
64622                // 0x08900000
64623                if (((instr & 0xf0000000) == 0xf0000000)) {
64624                  UnallocatedA32(instr);
64625                  return;
64626                }
64627                if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
64628                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
64629                    ((instr & 0xf0000000) != 0xf0000000) &&
64630                    (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
64631                  Condition condition((instr >> 28) & 0xf);
64632                  RegisterList registers((instr & 0xffff));
64633                  // POP{<c>}{<q>} <registers> ; A1
64634                  pop(condition, Best, registers);
64635                  return;
64636                }
64637                Condition condition((instr >> 28) & 0xf);
64638                unsigned rn = (instr >> 16) & 0xf;
64639                WriteBack write_back((instr >> 21) & 0x1);
64640                RegisterList registers((instr & 0xffff));
64641                // LDM{<c>}{<q>} <Rn>{!}, <registers> ; A1
64642                ldm(condition, Best, Register(rn), write_back, registers);
64643                break;
64644              }
64645              case 0x01000000: {
64646                // 0x09100000
64647                if (((instr & 0xf0000000) == 0xf0000000)) {
64648                  UnallocatedA32(instr);
64649                  return;
64650                }
64651                Condition condition((instr >> 28) & 0xf);
64652                unsigned rn = (instr >> 16) & 0xf;
64653                WriteBack write_back((instr >> 21) & 0x1);
64654                RegisterList registers((instr & 0xffff));
64655                // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
64656                ldmdb(condition, Register(rn), write_back, registers);
64657                break;
64658              }
64659              case 0x01800000: {
64660                // 0x09900000
64661                if (((instr & 0xf0000000) == 0xf0000000)) {
64662                  UnallocatedA32(instr);
64663                  return;
64664                }
64665                Condition condition((instr >> 28) & 0xf);
64666                unsigned rn = (instr >> 16) & 0xf;
64667                WriteBack write_back((instr >> 21) & 0x1);
64668                RegisterList registers((instr & 0xffff));
64669                // LDMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
64670                ldmib(condition, Register(rn), write_back, registers);
64671                break;
64672              }
64673            }
64674            break;
64675          }
64676          case 0x00400000: {
64677            // 0x08400000
64678            if (((instr & 0xf0000000) == 0xf0000000)) {
64679              UnallocatedA32(instr);
64680              return;
64681            }
64682            UnimplementedA32("STM", instr);
64683            break;
64684          }
64685          case 0x00500000: {
64686            // 0x08500000
64687            switch (instr & 0x00008000) {
64688              case 0x00000000: {
64689                // 0x08500000
64690                if (((instr & 0xf0000000) == 0xf0000000)) {
64691                  UnallocatedA32(instr);
64692                  return;
64693                }
64694                UnimplementedA32("LDM", instr);
64695                break;
64696              }
64697              case 0x00008000: {
64698                // 0x08508000
64699                if (((instr & 0xf0000000) == 0xf0000000)) {
64700                  UnallocatedA32(instr);
64701                  return;
64702                }
64703                UnimplementedA32("LDM", instr);
64704                break;
64705              }
64706            }
64707            break;
64708          }
64709        }
64710        break;
64711      }
64712      case 0x0a000000: {
64713        // 0x0a000000
64714        switch (instr & 0x01000000) {
64715          case 0x00000000: {
64716            // 0x0a000000
64717            if (((instr & 0xf0000000) == 0xf0000000)) {
64718              UnallocatedA32(instr);
64719              return;
64720            }
64721            Condition condition((instr >> 28) & 0xf);
64722            int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26);
64723            Location location(imm, kA32PcDelta);
64724            // B{<c>}{<q>} <label> ; A1
64725            b(condition, Best, &location);
64726            break;
64727          }
64728          case 0x01000000: {
64729            // 0x0b000000
64730            if (((instr & 0xf0000000) == 0xf0000000)) {
64731              UnallocatedA32(instr);
64732              return;
64733            }
64734            Condition condition((instr >> 28) & 0xf);
64735            int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26);
64736            Location location(imm, kA32PcDelta);
64737            // BL{<c>}{<q>} <label> ; A1
64738            bl(condition, &location);
64739            break;
64740          }
64741        }
64742        break;
64743      }
64744      case 0x0c000000: {
64745        // 0x0c000000
64746        switch (instr & 0x01100e00) {
64747          case 0x00000a00: {
64748            // 0x0c000a00
64749            switch (instr & 0x00800100) {
64750              case 0x00000000: {
64751                // 0x0c000a00
64752                if ((instr & 0x006000d0) == 0x00400010) {
64753                  if (((instr & 0xf0000000) == 0xf0000000)) {
64754                    UnallocatedA32(instr);
64755                    return;
64756                  }
64757                  Condition condition((instr >> 28) & 0xf);
64758                  unsigned rm = ExtractSRegister(instr, 5, 0);
64759                  unsigned rt = (instr >> 12) & 0xf;
64760                  unsigned rt2 = (instr >> 16) & 0xf;
64761                  // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; A1
64762                  vmov(condition,
64763                       SRegister(rm),
64764                       SRegister(rm + 1),
64765                       Register(rt),
64766                       Register(rt2));
64767                } else {
64768                  UnallocatedA32(instr);
64769                }
64770                break;
64771              }
64772              case 0x00000100: {
64773                // 0x0c000b00
64774                if ((instr & 0x006000d0) == 0x00400010) {
64775                  if (((instr & 0xf0000000) == 0xf0000000)) {
64776                    UnallocatedA32(instr);
64777                    return;
64778                  }
64779                  Condition condition((instr >> 28) & 0xf);
64780                  unsigned rm = ExtractDRegister(instr, 5, 0);
64781                  unsigned rt = (instr >> 12) & 0xf;
64782                  unsigned rt2 = (instr >> 16) & 0xf;
64783                  // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; A1
64784                  vmov(condition, DRegister(rm), Register(rt), Register(rt2));
64785                } else {
64786                  UnallocatedA32(instr);
64787                }
64788                break;
64789              }
64790              case 0x00800000: {
64791                // 0x0c800a00
64792                if (((instr & 0xf0000000) == 0xf0000000)) {
64793                  UnallocatedA32(instr);
64794                  return;
64795                }
64796                Condition condition((instr >> 28) & 0xf);
64797                unsigned rn = (instr >> 16) & 0xf;
64798                WriteBack write_back((instr >> 21) & 0x1);
64799                unsigned first = ExtractSRegister(instr, 22, 12);
64800                unsigned len = instr & 0xff;
64801                // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
64802                vstm(condition,
64803                     kDataTypeValueNone,
64804                     Register(rn),
64805                     write_back,
64806                     SRegisterList(SRegister(first), len));
64807                if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
64808                  UnpredictableA32(instr);
64809                }
64810                break;
64811              }
64812              case 0x00800100: {
64813                // 0x0c800b00
64814                switch (instr & 0x00000001) {
64815                  case 0x00000000: {
64816                    // 0x0c800b00
64817                    if (((instr & 0xf0000000) == 0xf0000000)) {
64818                      UnallocatedA32(instr);
64819                      return;
64820                    }
64821                    Condition condition((instr >> 28) & 0xf);
64822                    unsigned rn = (instr >> 16) & 0xf;
64823                    WriteBack write_back((instr >> 21) & 0x1);
64824                    unsigned first = ExtractDRegister(instr, 22, 12);
64825                    unsigned imm8 = (instr & 0xff);
64826                    unsigned len = imm8 / 2;
64827                    unsigned end = first + len;
64828                    // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
64829                    vstm(condition,
64830                         kDataTypeValueNone,
64831                         Register(rn),
64832                         write_back,
64833                         DRegisterList(DRegister(first), len));
64834                    if ((len == 0) || (len > 16) ||
64835                        (end > kMaxNumberOfDRegisters)) {
64836                      UnpredictableA32(instr);
64837                    }
64838                    break;
64839                  }
64840                  case 0x00000001: {
64841                    // 0x0c800b01
64842                    if (((instr & 0xf0000000) == 0xf0000000)) {
64843                      UnallocatedA32(instr);
64844                      return;
64845                    }
64846                    Condition condition((instr >> 28) & 0xf);
64847                    unsigned rn = (instr >> 16) & 0xf;
64848                    WriteBack write_back((instr >> 21) & 0x1);
64849                    unsigned first = ExtractDRegister(instr, 22, 12);
64850                    unsigned imm8 = (instr & 0xff);
64851                    unsigned len = imm8 / 2;
64852                    unsigned end = first + len;
64853                    // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
64854                    fstmiax(condition,
64855                            Register(rn),
64856                            write_back,
64857                            DRegisterList(DRegister(first), len));
64858                    if ((len == 0) || (len > 16) || (end > 16)) {
64859                      UnpredictableA32(instr);
64860                    }
64861                    break;
64862                  }
64863                }
64864                break;
64865              }
64866            }
64867            break;
64868          }
64869          case 0x00000e00: {
64870            // 0x0c000e00
64871            switch (instr & 0x00600000) {
64872              case 0x00000000: {
64873                // 0x0c000e00
64874                if ((instr & 0x0080f100) == 0x00805000) {
64875                  if (((instr & 0xf0000000) == 0xf0000000)) {
64876                    UnallocatedA32(instr);
64877                    return;
64878                  }
64879                  UnimplementedA32("STC", instr);
64880                } else {
64881                  UnallocatedA32(instr);
64882                }
64883                break;
64884              }
64885              case 0x00200000: {
64886                // 0x0c200e00
64887                if ((instr & 0x0000f100) == 0x00005000) {
64888                  if (((instr & 0xf0000000) == 0xf0000000)) {
64889                    UnallocatedA32(instr);
64890                    return;
64891                  }
64892                  UnimplementedA32("STC", instr);
64893                } else {
64894                  UnallocatedA32(instr);
64895                }
64896                break;
64897              }
64898              case 0x00400000: {
64899                // 0x0c400e00
64900                if ((instr & 0x00800000) == 0x00000000) {
64901                  if (((instr & 0xf0000000) == 0xf0000000)) {
64902                    UnallocatedA32(instr);
64903                    return;
64904                  }
64905                  UnimplementedA32("MCRR", instr);
64906                } else {
64907                  UnallocatedA32(instr);
64908                }
64909                break;
64910              }
64911              default:
64912                UnallocatedA32(instr);
64913                break;
64914            }
64915            break;
64916          }
64917          case 0x00100a00: {
64918            // 0x0c100a00
64919            switch (instr & 0x00800100) {
64920              case 0x00000000: {
64921                // 0x0c100a00
64922                if ((instr & 0x006000d0) == 0x00400010) {
64923                  if (((instr & 0xf0000000) == 0xf0000000)) {
64924                    UnallocatedA32(instr);
64925                    return;
64926                  }
64927                  Condition condition((instr >> 28) & 0xf);
64928                  unsigned rt = (instr >> 12) & 0xf;
64929                  unsigned rt2 = (instr >> 16) & 0xf;
64930                  unsigned rm = ExtractSRegister(instr, 5, 0);
64931                  // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; A1
64932                  vmov(condition,
64933                       Register(rt),
64934                       Register(rt2),
64935                       SRegister(rm),
64936                       SRegister(rm + 1));
64937                } else {
64938                  UnallocatedA32(instr);
64939                }
64940                break;
64941              }
64942              case 0x00000100: {
64943                // 0x0c100b00
64944                if ((instr & 0x006000d0) == 0x00400010) {
64945                  if (((instr & 0xf0000000) == 0xf0000000)) {
64946                    UnallocatedA32(instr);
64947                    return;
64948                  }
64949                  Condition condition((instr >> 28) & 0xf);
64950                  unsigned rt = (instr >> 12) & 0xf;
64951                  unsigned rt2 = (instr >> 16) & 0xf;
64952                  unsigned rm = ExtractDRegister(instr, 5, 0);
64953                  // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; A1
64954                  vmov(condition, Register(rt), Register(rt2), DRegister(rm));
64955                } else {
64956                  UnallocatedA32(instr);
64957                }
64958                break;
64959              }
64960              case 0x00800000: {
64961                // 0x0c900a00
64962                if (((instr & 0xf0000000) == 0xf0000000)) {
64963                  UnallocatedA32(instr);
64964                  return;
64965                }
64966                if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
64967                    ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
64968                    ((instr & 0xf0000000) != 0xf0000000)) {
64969                  Condition condition((instr >> 28) & 0xf);
64970                  unsigned first = ExtractSRegister(instr, 22, 12);
64971                  unsigned len = instr & 0xff;
64972                  // VPOP{<c>}{<q>}{.<size>} <sreglist> ; A2
64973                  vpop(condition,
64974                       kDataTypeValueNone,
64975                       SRegisterList(SRegister(first), len));
64976                  if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
64977                    UnpredictableA32(instr);
64978                  }
64979                  return;
64980                }
64981                Condition condition((instr >> 28) & 0xf);
64982                unsigned rn = (instr >> 16) & 0xf;
64983                WriteBack write_back((instr >> 21) & 0x1);
64984                unsigned first = ExtractSRegister(instr, 22, 12);
64985                unsigned len = instr & 0xff;
64986                // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
64987                vldm(condition,
64988                     kDataTypeValueNone,
64989                     Register(rn),
64990                     write_back,
64991                     SRegisterList(SRegister(first), len));
64992                if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
64993                  UnpredictableA32(instr);
64994                }
64995                break;
64996              }
64997              case 0x00800100: {
64998                // 0x0c900b00
64999                switch (instr & 0x00000001) {
65000                  case 0x00000000: {
65001                    // 0x0c900b00
65002                    if (((instr & 0xf0000000) == 0xf0000000)) {
65003                      UnallocatedA32(instr);
65004                      return;
65005                    }
65006                    if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
65007                         Uint32(0x1)) &&
65008                        ((Uint32((instr >> 16)) & Uint32(0xf)) ==
65009                         Uint32(0xd)) &&
65010                        ((instr & 0xf0000000) != 0xf0000000)) {
65011                      Condition condition((instr >> 28) & 0xf);
65012                      unsigned first = ExtractDRegister(instr, 22, 12);
65013                      unsigned imm8 = (instr & 0xff);
65014                      unsigned len = imm8 / 2;
65015                      unsigned end = first + len;
65016                      // VPOP{<c>}{<q>}{.<size>} <dreglist> ; A1
65017                      vpop(condition,
65018                           kDataTypeValueNone,
65019                           DRegisterList(DRegister(first), len));
65020                      if ((len == 0) || (len > 16) ||
65021                          (end > kMaxNumberOfDRegisters)) {
65022                        UnpredictableA32(instr);
65023                      }
65024                      return;
65025                    }
65026                    Condition condition((instr >> 28) & 0xf);
65027                    unsigned rn = (instr >> 16) & 0xf;
65028                    WriteBack write_back((instr >> 21) & 0x1);
65029                    unsigned first = ExtractDRegister(instr, 22, 12);
65030                    unsigned imm8 = (instr & 0xff);
65031                    unsigned len = imm8 / 2;
65032                    unsigned end = first + len;
65033                    // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
65034                    vldm(condition,
65035                         kDataTypeValueNone,
65036                         Register(rn),
65037                         write_back,
65038                         DRegisterList(DRegister(first), len));
65039                    if ((len == 0) || (len > 16) ||
65040                        (end > kMaxNumberOfDRegisters)) {
65041                      UnpredictableA32(instr);
65042                    }
65043                    break;
65044                  }
65045                  case 0x00000001: {
65046                    // 0x0c900b01
65047                    if (((instr & 0xf0000000) == 0xf0000000)) {
65048                      UnallocatedA32(instr);
65049                      return;
65050                    }
65051                    Condition condition((instr >> 28) & 0xf);
65052                    unsigned rn = (instr >> 16) & 0xf;
65053                    WriteBack write_back((instr >> 21) & 0x1);
65054                    unsigned first = ExtractDRegister(instr, 22, 12);
65055                    unsigned imm8 = (instr & 0xff);
65056                    unsigned len = imm8 / 2;
65057                    unsigned end = first + len;
65058                    // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
65059                    fldmiax(condition,
65060                            Register(rn),
65061                            write_back,
65062                            DRegisterList(DRegister(first), len));
65063                    if ((len == 0) || (len > 16) || (end > 16)) {
65064                      UnpredictableA32(instr);
65065                    }
65066                    break;
65067                  }
65068                }
65069                break;
65070              }
65071            }
65072            break;
65073          }
65074          case 0x00100e00: {
65075            // 0x0c100e00
65076            switch (instr & 0x00600000) {
65077              case 0x00000000: {
65078                // 0x0c100e00
65079                switch (instr & 0x0080f100) {
65080                  case 0x00805000: {
65081                    // 0x0c905e00
65082                    switch (instr & 0x000f0000) {
65083                      case 0x000f0000: {
65084                        // 0x0c9f5e00
65085                        if (((instr & 0xf0000000) == 0xf0000000)) {
65086                          UnallocatedA32(instr);
65087                          return;
65088                        }
65089                        UnimplementedA32("LDC", instr);
65090                        break;
65091                      }
65092                      default: {
65093                        if (((instr & 0xf0000000) == 0xf0000000) ||
65094                            ((instr & 0xf0000) == 0xf0000)) {
65095                          UnallocatedA32(instr);
65096                          return;
65097                        }
65098                        UnimplementedA32("LDC", instr);
65099                        break;
65100                      }
65101                    }
65102                    break;
65103                  }
65104                  default:
65105                    UnallocatedA32(instr);
65106                    break;
65107                }
65108                break;
65109              }
65110              case 0x00200000: {
65111                // 0x0c300e00
65112                if ((instr & 0x0000f100) == 0x00005000) {
65113                  if (((instr & 0xf0000000) == 0xf0000000) ||
65114                      ((instr & 0xf0000) == 0xf0000)) {
65115                    UnallocatedA32(instr);
65116                    return;
65117                  }
65118                  UnimplementedA32("LDC", instr);
65119                } else {
65120                  UnallocatedA32(instr);
65121                }
65122                break;
65123              }
65124              case 0x00400000: {
65125                // 0x0c500e00
65126                if ((instr & 0x00800000) == 0x00000000) {
65127                  if (((instr & 0xf0000000) == 0xf0000000)) {
65128                    UnallocatedA32(instr);
65129                    return;
65130                  }
65131                  UnimplementedA32("MRRC", instr);
65132                } else {
65133                  UnallocatedA32(instr);
65134                }
65135                break;
65136              }
65137              default:
65138                UnallocatedA32(instr);
65139                break;
65140            }
65141            break;
65142          }
65143          case 0x01000a00: {
65144            // 0x0d000a00
65145            switch (instr & 0x00200100) {
65146              case 0x00000000: {
65147                // 0x0d000a00
65148                if (((instr & 0xf0000000) == 0xf0000000)) {
65149                  UnallocatedA32(instr);
65150                  return;
65151                }
65152                Condition condition((instr >> 28) & 0xf);
65153                unsigned rd = ExtractSRegister(instr, 22, 12);
65154                unsigned rn = (instr >> 16) & 0xf;
65155                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65156                int32_t offset = (instr & 0xff) << 2;
65157                // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
65158                vstr(condition,
65159                     Untyped32,
65160                     SRegister(rd),
65161                     MemOperand(Register(rn), sign, offset, Offset));
65162                break;
65163              }
65164              case 0x00000100: {
65165                // 0x0d000b00
65166                if (((instr & 0xf0000000) == 0xf0000000)) {
65167                  UnallocatedA32(instr);
65168                  return;
65169                }
65170                Condition condition((instr >> 28) & 0xf);
65171                unsigned rd = ExtractDRegister(instr, 22, 12);
65172                unsigned rn = (instr >> 16) & 0xf;
65173                Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65174                int32_t offset = (instr & 0xff) << 2;
65175                // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
65176                vstr(condition,
65177                     Untyped64,
65178                     DRegister(rd),
65179                     MemOperand(Register(rn), sign, offset, Offset));
65180                break;
65181              }
65182              case 0x00200000: {
65183                // 0x0d200a00
65184                if ((instr & 0x00800000) == 0x00000000) {
65185                  if (((instr & 0xf0000000) == 0xf0000000)) {
65186                    UnallocatedA32(instr);
65187                    return;
65188                  }
65189                  if (((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
65190                      ((instr & 0xf0000000) != 0xf0000000)) {
65191                    Condition condition((instr >> 28) & 0xf);
65192                    unsigned first = ExtractSRegister(instr, 22, 12);
65193                    unsigned len = instr & 0xff;
65194                    // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; A2
65195                    vpush(condition,
65196                          kDataTypeValueNone,
65197                          SRegisterList(SRegister(first), len));
65198                    if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65199                      UnpredictableA32(instr);
65200                    }
65201                    return;
65202                  }
65203                  Condition condition((instr >> 28) & 0xf);
65204                  unsigned rn = (instr >> 16) & 0xf;
65205                  unsigned first = ExtractSRegister(instr, 22, 12);
65206                  unsigned len = instr & 0xff;
65207                  // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
65208                  vstmdb(condition,
65209                         kDataTypeValueNone,
65210                         Register(rn),
65211                         WriteBack(WRITE_BACK),
65212                         SRegisterList(SRegister(first), len));
65213                  if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65214                    UnpredictableA32(instr);
65215                  }
65216                } else {
65217                  UnallocatedA32(instr);
65218                }
65219                break;
65220              }
65221              case 0x00200100: {
65222                // 0x0d200b00
65223                switch (instr & 0x00800001) {
65224                  case 0x00000000: {
65225                    // 0x0d200b00
65226                    if (((instr & 0xf0000000) == 0xf0000000)) {
65227                      UnallocatedA32(instr);
65228                      return;
65229                    }
65230                    if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
65231                         Uint32(0xd)) &&
65232                        ((instr & 0xf0000000) != 0xf0000000)) {
65233                      Condition condition((instr >> 28) & 0xf);
65234                      unsigned first = ExtractDRegister(instr, 22, 12);
65235                      unsigned imm8 = (instr & 0xff);
65236                      unsigned len = imm8 / 2;
65237                      unsigned end = first + len;
65238                      // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; A1
65239                      vpush(condition,
65240                            kDataTypeValueNone,
65241                            DRegisterList(DRegister(first), len));
65242                      if ((len == 0) || (len > 16) ||
65243                          (end > kMaxNumberOfDRegisters)) {
65244                        UnpredictableA32(instr);
65245                      }
65246                      return;
65247                    }
65248                    Condition condition((instr >> 28) & 0xf);
65249                    unsigned rn = (instr >> 16) & 0xf;
65250                    unsigned first = ExtractDRegister(instr, 22, 12);
65251                    unsigned imm8 = (instr & 0xff);
65252                    unsigned len = imm8 / 2;
65253                    unsigned end = first + len;
65254                    // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
65255                    vstmdb(condition,
65256                           kDataTypeValueNone,
65257                           Register(rn),
65258                           WriteBack(WRITE_BACK),
65259                           DRegisterList(DRegister(first), len));
65260                    if ((len == 0) || (len > 16) ||
65261                        (end > kMaxNumberOfDRegisters)) {
65262                      UnpredictableA32(instr);
65263                    }
65264                    break;
65265                  }
65266                  case 0x00000001: {
65267                    // 0x0d200b01
65268                    if (((instr & 0xf0000000) == 0xf0000000)) {
65269                      UnallocatedA32(instr);
65270                      return;
65271                    }
65272                    Condition condition((instr >> 28) & 0xf);
65273                    unsigned rn = (instr >> 16) & 0xf;
65274                    unsigned first = ExtractDRegister(instr, 22, 12);
65275                    unsigned imm8 = (instr & 0xff);
65276                    unsigned len = imm8 / 2;
65277                    unsigned end = first + len;
65278                    // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
65279                    fstmdbx(condition,
65280                            Register(rn),
65281                            WriteBack(WRITE_BACK),
65282                            DRegisterList(DRegister(first), len));
65283                    if ((len == 0) || (len > 16) || (end > 16)) {
65284                      UnpredictableA32(instr);
65285                    }
65286                    break;
65287                  }
65288                  default:
65289                    UnallocatedA32(instr);
65290                    break;
65291                }
65292                break;
65293              }
65294            }
65295            break;
65296          }
65297          case 0x01000e00: {
65298            // 0x0d000e00
65299            switch (instr & 0x0060f100) {
65300              case 0x00005000: {
65301                // 0x0d005e00
65302                if (((instr & 0xf0000000) == 0xf0000000)) {
65303                  UnallocatedA32(instr);
65304                  return;
65305                }
65306                UnimplementedA32("STC", instr);
65307                break;
65308              }
65309              case 0x00205000: {
65310                // 0x0d205e00
65311                if (((instr & 0xf0000000) == 0xf0000000)) {
65312                  UnallocatedA32(instr);
65313                  return;
65314                }
65315                UnimplementedA32("STC", instr);
65316                break;
65317              }
65318              default:
65319                UnallocatedA32(instr);
65320                break;
65321            }
65322            break;
65323          }
65324          case 0x01100a00: {
65325            // 0x0d100a00
65326            switch (instr & 0x00200100) {
65327              case 0x00000000: {
65328                // 0x0d100a00
65329                switch (instr & 0x000f0000) {
65330                  case 0x000f0000: {
65331                    // 0x0d1f0a00
65332                    if (((instr & 0xf0000000) == 0xf0000000)) {
65333                      UnallocatedA32(instr);
65334                      return;
65335                    }
65336                    Condition condition((instr >> 28) & 0xf);
65337                    unsigned rd = ExtractSRegister(instr, 22, 12);
65338                    uint32_t U = (instr >> 23) & 0x1;
65339                    int32_t imm = instr & 0xff;
65340                    imm <<= 2;
65341                    if (U == 0) imm = -imm;
65342                    bool minus_zero = (imm == 0) && (U == 0);
65343                    Location location(imm, kA32PcDelta);
65344                    // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; A2
65345                    if (minus_zero) {
65346                      vldr(condition,
65347                           Untyped32,
65348                           SRegister(rd),
65349                           MemOperand(pc, minus, 0));
65350                    } else {
65351                      vldr(condition, Untyped32, SRegister(rd), &location);
65352                    }
65353                    break;
65354                  }
65355                  default: {
65356                    if (((instr & 0xf0000000) == 0xf0000000) ||
65357                        ((instr & 0xf0000) == 0xf0000)) {
65358                      UnallocatedA32(instr);
65359                      return;
65360                    }
65361                    Condition condition((instr >> 28) & 0xf);
65362                    unsigned rd = ExtractSRegister(instr, 22, 12);
65363                    unsigned rn = (instr >> 16) & 0xf;
65364                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65365                    int32_t offset = (instr & 0xff) << 2;
65366                    // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
65367                    vldr(condition,
65368                         Untyped32,
65369                         SRegister(rd),
65370                         MemOperand(Register(rn), sign, offset, Offset));
65371                    break;
65372                  }
65373                }
65374                break;
65375              }
65376              case 0x00000100: {
65377                // 0x0d100b00
65378                switch (instr & 0x000f0000) {
65379                  case 0x000f0000: {
65380                    // 0x0d1f0b00
65381                    if (((instr & 0xf0000000) == 0xf0000000)) {
65382                      UnallocatedA32(instr);
65383                      return;
65384                    }
65385                    Condition condition((instr >> 28) & 0xf);
65386                    unsigned rd = ExtractDRegister(instr, 22, 12);
65387                    uint32_t U = (instr >> 23) & 0x1;
65388                    int32_t imm = instr & 0xff;
65389                    imm <<= 2;
65390                    if (U == 0) imm = -imm;
65391                    bool minus_zero = (imm == 0) && (U == 0);
65392                    Location location(imm, kA32PcDelta);
65393                    // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; A1
65394                    if (minus_zero) {
65395                      vldr(condition,
65396                           Untyped64,
65397                           DRegister(rd),
65398                           MemOperand(pc, minus, 0));
65399                    } else {
65400                      vldr(condition, Untyped64, DRegister(rd), &location);
65401                    }
65402                    break;
65403                  }
65404                  default: {
65405                    if (((instr & 0xf0000000) == 0xf0000000) ||
65406                        ((instr & 0xf0000) == 0xf0000)) {
65407                      UnallocatedA32(instr);
65408                      return;
65409                    }
65410                    Condition condition((instr >> 28) & 0xf);
65411                    unsigned rd = ExtractDRegister(instr, 22, 12);
65412                    unsigned rn = (instr >> 16) & 0xf;
65413                    Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65414                    int32_t offset = (instr & 0xff) << 2;
65415                    // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
65416                    vldr(condition,
65417                         Untyped64,
65418                         DRegister(rd),
65419                         MemOperand(Register(rn), sign, offset, Offset));
65420                    break;
65421                  }
65422                }
65423                break;
65424              }
65425              case 0x00200000: {
65426                // 0x0d300a00
65427                if ((instr & 0x00800000) == 0x00000000) {
65428                  if (((instr & 0xf0000000) == 0xf0000000)) {
65429                    UnallocatedA32(instr);
65430                    return;
65431                  }
65432                  Condition condition((instr >> 28) & 0xf);
65433                  unsigned rn = (instr >> 16) & 0xf;
65434                  unsigned first = ExtractSRegister(instr, 22, 12);
65435                  unsigned len = instr & 0xff;
65436                  // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
65437                  vldmdb(condition,
65438                         kDataTypeValueNone,
65439                         Register(rn),
65440                         WriteBack(WRITE_BACK),
65441                         SRegisterList(SRegister(first), len));
65442                  if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65443                    UnpredictableA32(instr);
65444                  }
65445                } else {
65446                  UnallocatedA32(instr);
65447                }
65448                break;
65449              }
65450              case 0x00200100: {
65451                // 0x0d300b00
65452                switch (instr & 0x00800001) {
65453                  case 0x00000000: {
65454                    // 0x0d300b00
65455                    if (((instr & 0xf0000000) == 0xf0000000)) {
65456                      UnallocatedA32(instr);
65457                      return;
65458                    }
65459                    Condition condition((instr >> 28) & 0xf);
65460                    unsigned rn = (instr >> 16) & 0xf;
65461                    unsigned first = ExtractDRegister(instr, 22, 12);
65462                    unsigned imm8 = (instr & 0xff);
65463                    unsigned len = imm8 / 2;
65464                    unsigned end = first + len;
65465                    // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
65466                    vldmdb(condition,
65467                           kDataTypeValueNone,
65468                           Register(rn),
65469                           WriteBack(WRITE_BACK),
65470                           DRegisterList(DRegister(first), len));
65471                    if ((len == 0) || (len > 16) ||
65472                        (end > kMaxNumberOfDRegisters)) {
65473                      UnpredictableA32(instr);
65474                    }
65475                    break;
65476                  }
65477                  case 0x00000001: {
65478                    // 0x0d300b01
65479                    if (((instr & 0xf0000000) == 0xf0000000)) {
65480                      UnallocatedA32(instr);
65481                      return;
65482                    }
65483                    Condition condition((instr >> 28) & 0xf);
65484                    unsigned rn = (instr >> 16) & 0xf;
65485                    unsigned first = ExtractDRegister(instr, 22, 12);
65486                    unsigned imm8 = (instr & 0xff);
65487                    unsigned len = imm8 / 2;
65488                    unsigned end = first + len;
65489                    // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
65490                    fldmdbx(condition,
65491                            Register(rn),
65492                            WriteBack(WRITE_BACK),
65493                            DRegisterList(DRegister(first), len));
65494                    if ((len == 0) || (len > 16) || (end > 16)) {
65495                      UnpredictableA32(instr);
65496                    }
65497                    break;
65498                  }
65499                  default:
65500                    UnallocatedA32(instr);
65501                    break;
65502                }
65503                break;
65504              }
65505            }
65506            break;
65507          }
65508          case 0x01100e00: {
65509            // 0x0d100e00
65510            switch (instr & 0x0060f100) {
65511              case 0x00005000: {
65512                // 0x0d105e00
65513                switch (instr & 0x000f0000) {
65514                  case 0x000f0000: {
65515                    // 0x0d1f5e00
65516                    if (((instr & 0xf0000000) == 0xf0000000)) {
65517                      UnallocatedA32(instr);
65518                      return;
65519                    }
65520                    UnimplementedA32("LDC", instr);
65521                    break;
65522                  }
65523                  default: {
65524                    if (((instr & 0xf0000000) == 0xf0000000) ||
65525                        ((instr & 0xf0000) == 0xf0000)) {
65526                      UnallocatedA32(instr);
65527                      return;
65528                    }
65529                    UnimplementedA32("LDC", instr);
65530                    break;
65531                  }
65532                }
65533                break;
65534              }
65535              case 0x00205000: {
65536                // 0x0d305e00
65537                if (((instr & 0xf0000000) == 0xf0000000) ||
65538                    ((instr & 0xf0000) == 0xf0000)) {
65539                  UnallocatedA32(instr);
65540                  return;
65541                }
65542                UnimplementedA32("LDC", instr);
65543                break;
65544              }
65545              default:
65546                UnallocatedA32(instr);
65547                break;
65548            }
65549            break;
65550          }
65551          default:
65552            UnallocatedA32(instr);
65553            break;
65554        }
65555        break;
65556      }
65557      case 0x0e000000: {
65558        // 0x0e000000
65559        switch (instr & 0x01000000) {
65560          case 0x00000000: {
65561            // 0x0e000000
65562            switch (instr & 0x00100e10) {
65563              case 0x00000a00: {
65564                // 0x0e000a00
65565                switch (instr & 0x00a00140) {
65566                  case 0x00000000: {
65567                    // 0x0e000a00
65568                    if (((instr & 0xf0000000) == 0xf0000000)) {
65569                      UnallocatedA32(instr);
65570                      return;
65571                    }
65572                    Condition condition((instr >> 28) & 0xf);
65573                    unsigned rd = ExtractSRegister(instr, 22, 12);
65574                    unsigned rn = ExtractSRegister(instr, 7, 16);
65575                    unsigned rm = ExtractSRegister(instr, 5, 0);
65576                    // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
65577                    vmla(condition,
65578                         F32,
65579                         SRegister(rd),
65580                         SRegister(rn),
65581                         SRegister(rm));
65582                    break;
65583                  }
65584                  case 0x00000040: {
65585                    // 0x0e000a40
65586                    if (((instr & 0xf0000000) == 0xf0000000)) {
65587                      UnallocatedA32(instr);
65588                      return;
65589                    }
65590                    Condition condition((instr >> 28) & 0xf);
65591                    unsigned rd = ExtractSRegister(instr, 22, 12);
65592                    unsigned rn = ExtractSRegister(instr, 7, 16);
65593                    unsigned rm = ExtractSRegister(instr, 5, 0);
65594                    // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
65595                    vmls(condition,
65596                         F32,
65597                         SRegister(rd),
65598                         SRegister(rn),
65599                         SRegister(rm));
65600                    break;
65601                  }
65602                  case 0x00000100: {
65603                    // 0x0e000b00
65604                    if (((instr & 0xf0000000) == 0xf0000000)) {
65605                      UnallocatedA32(instr);
65606                      return;
65607                    }
65608                    Condition condition((instr >> 28) & 0xf);
65609                    unsigned rd = ExtractDRegister(instr, 22, 12);
65610                    unsigned rn = ExtractDRegister(instr, 7, 16);
65611                    unsigned rm = ExtractDRegister(instr, 5, 0);
65612                    // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
65613                    vmla(condition,
65614                         F64,
65615                         DRegister(rd),
65616                         DRegister(rn),
65617                         DRegister(rm));
65618                    break;
65619                  }
65620                  case 0x00000140: {
65621                    // 0x0e000b40
65622                    if (((instr & 0xf0000000) == 0xf0000000)) {
65623                      UnallocatedA32(instr);
65624                      return;
65625                    }
65626                    Condition condition((instr >> 28) & 0xf);
65627                    unsigned rd = ExtractDRegister(instr, 22, 12);
65628                    unsigned rn = ExtractDRegister(instr, 7, 16);
65629                    unsigned rm = ExtractDRegister(instr, 5, 0);
65630                    // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
65631                    vmls(condition,
65632                         F64,
65633                         DRegister(rd),
65634                         DRegister(rn),
65635                         DRegister(rm));
65636                    break;
65637                  }
65638                  case 0x00200000: {
65639                    // 0x0e200a00
65640                    if (((instr & 0xf0000000) == 0xf0000000)) {
65641                      UnallocatedA32(instr);
65642                      return;
65643                    }
65644                    Condition condition((instr >> 28) & 0xf);
65645                    unsigned rd = ExtractSRegister(instr, 22, 12);
65646                    unsigned rn = ExtractSRegister(instr, 7, 16);
65647                    unsigned rm = ExtractSRegister(instr, 5, 0);
65648                    // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
65649                    vmul(condition,
65650                         F32,
65651                         SRegister(rd),
65652                         SRegister(rn),
65653                         SRegister(rm));
65654                    break;
65655                  }
65656                  case 0x00200040: {
65657                    // 0x0e200a40
65658                    if (((instr & 0xf0000000) == 0xf0000000)) {
65659                      UnallocatedA32(instr);
65660                      return;
65661                    }
65662                    Condition condition((instr >> 28) & 0xf);
65663                    unsigned rd = ExtractSRegister(instr, 22, 12);
65664                    unsigned rn = ExtractSRegister(instr, 7, 16);
65665                    unsigned rm = ExtractSRegister(instr, 5, 0);
65666                    // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
65667                    vnmul(condition,
65668                          F32,
65669                          SRegister(rd),
65670                          SRegister(rn),
65671                          SRegister(rm));
65672                    break;
65673                  }
65674                  case 0x00200100: {
65675                    // 0x0e200b00
65676                    if (((instr & 0xf0000000) == 0xf0000000)) {
65677                      UnallocatedA32(instr);
65678                      return;
65679                    }
65680                    Condition condition((instr >> 28) & 0xf);
65681                    unsigned rd = ExtractDRegister(instr, 22, 12);
65682                    unsigned rn = ExtractDRegister(instr, 7, 16);
65683                    unsigned rm = ExtractDRegister(instr, 5, 0);
65684                    // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
65685                    vmul(condition,
65686                         F64,
65687                         DRegister(rd),
65688                         DRegister(rn),
65689                         DRegister(rm));
65690                    break;
65691                  }
65692                  case 0x00200140: {
65693                    // 0x0e200b40
65694                    if (((instr & 0xf0000000) == 0xf0000000)) {
65695                      UnallocatedA32(instr);
65696                      return;
65697                    }
65698                    Condition condition((instr >> 28) & 0xf);
65699                    unsigned rd = ExtractDRegister(instr, 22, 12);
65700                    unsigned rn = ExtractDRegister(instr, 7, 16);
65701                    unsigned rm = ExtractDRegister(instr, 5, 0);
65702                    // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
65703                    vnmul(condition,
65704                          F64,
65705                          DRegister(rd),
65706                          DRegister(rn),
65707                          DRegister(rm));
65708                    break;
65709                  }
65710                  case 0x00800000: {
65711                    // 0x0e800a00
65712                    if (((instr & 0xf0000000) == 0xf0000000)) {
65713                      UnallocatedA32(instr);
65714                      return;
65715                    }
65716                    Condition condition((instr >> 28) & 0xf);
65717                    unsigned rd = ExtractSRegister(instr, 22, 12);
65718                    unsigned rn = ExtractSRegister(instr, 7, 16);
65719                    unsigned rm = ExtractSRegister(instr, 5, 0);
65720                    // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
65721                    vdiv(condition,
65722                         F32,
65723                         SRegister(rd),
65724                         SRegister(rn),
65725                         SRegister(rm));
65726                    break;
65727                  }
65728                  case 0x00800100: {
65729                    // 0x0e800b00
65730                    if (((instr & 0xf0000000) == 0xf0000000)) {
65731                      UnallocatedA32(instr);
65732                      return;
65733                    }
65734                    Condition condition((instr >> 28) & 0xf);
65735                    unsigned rd = ExtractDRegister(instr, 22, 12);
65736                    unsigned rn = ExtractDRegister(instr, 7, 16);
65737                    unsigned rm = ExtractDRegister(instr, 5, 0);
65738                    // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
65739                    vdiv(condition,
65740                         F64,
65741                         DRegister(rd),
65742                         DRegister(rn),
65743                         DRegister(rm));
65744                    break;
65745                  }
65746                  case 0x00a00000: {
65747                    // 0x0ea00a00
65748                    if (((instr & 0xf0000000) == 0xf0000000)) {
65749                      UnallocatedA32(instr);
65750                      return;
65751                    }
65752                    Condition condition((instr >> 28) & 0xf);
65753                    unsigned rd = ExtractSRegister(instr, 22, 12);
65754                    unsigned rn = ExtractSRegister(instr, 7, 16);
65755                    unsigned rm = ExtractSRegister(instr, 5, 0);
65756                    // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
65757                    vfma(condition,
65758                         F32,
65759                         SRegister(rd),
65760                         SRegister(rn),
65761                         SRegister(rm));
65762                    break;
65763                  }
65764                  case 0x00a00040: {
65765                    // 0x0ea00a40
65766                    if (((instr & 0xf0000000) == 0xf0000000)) {
65767                      UnallocatedA32(instr);
65768                      return;
65769                    }
65770                    Condition condition((instr >> 28) & 0xf);
65771                    unsigned rd = ExtractSRegister(instr, 22, 12);
65772                    unsigned rn = ExtractSRegister(instr, 7, 16);
65773                    unsigned rm = ExtractSRegister(instr, 5, 0);
65774                    // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
65775                    vfms(condition,
65776                         F32,
65777                         SRegister(rd),
65778                         SRegister(rn),
65779                         SRegister(rm));
65780                    break;
65781                  }
65782                  case 0x00a00100: {
65783                    // 0x0ea00b00
65784                    if (((instr & 0xf0000000) == 0xf0000000)) {
65785                      UnallocatedA32(instr);
65786                      return;
65787                    }
65788                    Condition condition((instr >> 28) & 0xf);
65789                    unsigned rd = ExtractDRegister(instr, 22, 12);
65790                    unsigned rn = ExtractDRegister(instr, 7, 16);
65791                    unsigned rm = ExtractDRegister(instr, 5, 0);
65792                    // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
65793                    vfma(condition,
65794                         F64,
65795                         DRegister(rd),
65796                         DRegister(rn),
65797                         DRegister(rm));
65798                    break;
65799                  }
65800                  case 0x00a00140: {
65801                    // 0x0ea00b40
65802                    if (((instr & 0xf0000000) == 0xf0000000)) {
65803                      UnallocatedA32(instr);
65804                      return;
65805                    }
65806                    Condition condition((instr >> 28) & 0xf);
65807                    unsigned rd = ExtractDRegister(instr, 22, 12);
65808                    unsigned rn = ExtractDRegister(instr, 7, 16);
65809                    unsigned rm = ExtractDRegister(instr, 5, 0);
65810                    // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
65811                    vfms(condition,
65812                         F64,
65813                         DRegister(rd),
65814                         DRegister(rn),
65815                         DRegister(rm));
65816                    break;
65817                  }
65818                  default:
65819                    UnallocatedA32(instr);
65820                    break;
65821                }
65822                break;
65823              }
65824              case 0x00000a10: {
65825                // 0x0e000a10
65826                switch (instr & 0x00800100) {
65827                  case 0x00000000: {
65828                    // 0x0e000a10
65829                    if ((instr & 0x00600000) == 0x00000000) {
65830                      if (((instr & 0xf0000000) == 0xf0000000)) {
65831                        UnallocatedA32(instr);
65832                        return;
65833                      }
65834                      Condition condition((instr >> 28) & 0xf);
65835                      unsigned rn = ExtractSRegister(instr, 7, 16);
65836                      unsigned rt = (instr >> 12) & 0xf;
65837                      // VMOV{<c>}{<q>} <Sn>, <Rt> ; A1
65838                      vmov(condition, SRegister(rn), Register(rt));
65839                      if (((instr & 0xff00f7f) != 0xe000a10)) {
65840                        UnpredictableA32(instr);
65841                      }
65842                    } else {
65843                      UnallocatedA32(instr);
65844                    }
65845                    break;
65846                  }
65847                  case 0x00000100: {
65848                    // 0x0e000b10
65849                    if (((instr & 0xf0000000) == 0xf0000000)) {
65850                      UnallocatedA32(instr);
65851                      return;
65852                    }
65853                    Condition condition((instr >> 28) & 0xf);
65854                    unsigned lane;
65855                    DataType dt =
65856                        Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
65857                                                  ((instr >> 19) & 0xc),
65858                                              &lane);
65859                    if (dt.Is(kDataTypeValueInvalid)) {
65860                      UnallocatedA32(instr);
65861                      return;
65862                    }
65863                    unsigned rd = ExtractDRegister(instr, 7, 16);
65864                    unsigned rt = (instr >> 12) & 0xf;
65865                    // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; A1
65866                    vmov(condition, dt, DRegisterLane(rd, lane), Register(rt));
65867                    if (((instr & 0xf900f1f) != 0xe000b10)) {
65868                      UnpredictableA32(instr);
65869                    }
65870                    break;
65871                  }
65872                  case 0x00800000: {
65873                    // 0x0e800a10
65874                    if ((instr & 0x00600000) == 0x00600000) {
65875                      if (((instr & 0xf0000000) == 0xf0000000)) {
65876                        UnallocatedA32(instr);
65877                        return;
65878                      }
65879                      Condition condition((instr >> 28) & 0xf);
65880                      unsigned spec_reg = (instr >> 16) & 0xf;
65881                      unsigned rt = (instr >> 12) & 0xf;
65882                      switch (spec_reg) {
65883                        case 0x0:
65884                        case 0x1:
65885                        case 0x8: {
65886                          // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; A1
65887                          vmsr(condition,
65888                               SpecialFPRegister(spec_reg),
65889                               Register(rt));
65890                          if (((instr & 0xff00fff) != 0xee00a10)) {
65891                            UnpredictableA32(instr);
65892                          }
65893                          break;
65894                        }
65895                        default:
65896                          UnallocatedA32(instr);
65897                          break;
65898                      }
65899                    } else {
65900                      UnallocatedA32(instr);
65901                    }
65902                    break;
65903                  }
65904                  case 0x00800100: {
65905                    // 0x0e800b10
65906                    switch (instr & 0x00200040) {
65907                      case 0x00000000: {
65908                        // 0x0e800b10
65909                        if (((instr & 0xf0000000) == 0xf0000000)) {
65910                          UnallocatedA32(instr);
65911                          return;
65912                        }
65913                        Condition condition((instr >> 28) & 0xf);
65914                        DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
65915                                                      ((instr >> 21) & 0x2));
65916                        if (dt.Is(kDataTypeValueInvalid)) {
65917                          UnallocatedA32(instr);
65918                          return;
65919                        }
65920                        unsigned rd = ExtractDRegister(instr, 7, 16);
65921                        unsigned rt = (instr >> 12) & 0xf;
65922                        // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; A1
65923                        vdup(condition, dt, DRegister(rd), Register(rt));
65924                        if (((instr & 0xfb00f5f) != 0xe800b10)) {
65925                          UnpredictableA32(instr);
65926                        }
65927                        break;
65928                      }
65929                      case 0x00200000: {
65930                        // 0x0ea00b10
65931                        if (((instr & 0xf0000000) == 0xf0000000)) {
65932                          UnallocatedA32(instr);
65933                          return;
65934                        }
65935                        Condition condition((instr >> 28) & 0xf);
65936                        DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
65937                                                      ((instr >> 21) & 0x2));
65938                        if (dt.Is(kDataTypeValueInvalid)) {
65939                          UnallocatedA32(instr);
65940                          return;
65941                        }
65942                        if (((instr >> 16) & 1) != 0) {
65943                          UnallocatedA32(instr);
65944                          return;
65945                        }
65946                        unsigned rd = ExtractQRegister(instr, 7, 16);
65947                        unsigned rt = (instr >> 12) & 0xf;
65948                        // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; A1
65949                        vdup(condition, dt, QRegister(rd), Register(rt));
65950                        if (((instr & 0xfb00f5f) != 0xea00b10)) {
65951                          UnpredictableA32(instr);
65952                        }
65953                        break;
65954                      }
65955                      default:
65956                        UnallocatedA32(instr);
65957                        break;
65958                    }
65959                    break;
65960                  }
65961                }
65962                break;
65963              }
65964              case 0x00000e10: {
65965                // 0x0e000e10
65966                if (((instr & 0xf0000000) == 0xf0000000)) {
65967                  UnallocatedA32(instr);
65968                  return;
65969                }
65970                UnimplementedA32("MCR", instr);
65971                break;
65972              }
65973              case 0x00100a00: {
65974                // 0x0e100a00
65975                switch (instr & 0x00a00140) {
65976                  case 0x00000000: {
65977                    // 0x0e100a00
65978                    if (((instr & 0xf0000000) == 0xf0000000)) {
65979                      UnallocatedA32(instr);
65980                      return;
65981                    }
65982                    Condition condition((instr >> 28) & 0xf);
65983                    unsigned rd = ExtractSRegister(instr, 22, 12);
65984                    unsigned rn = ExtractSRegister(instr, 7, 16);
65985                    unsigned rm = ExtractSRegister(instr, 5, 0);
65986                    // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
65987                    vnmls(condition,
65988                          F32,
65989                          SRegister(rd),
65990                          SRegister(rn),
65991                          SRegister(rm));
65992                    break;
65993                  }
65994                  case 0x00000040: {
65995                    // 0x0e100a40
65996                    if (((instr & 0xf0000000) == 0xf0000000)) {
65997                      UnallocatedA32(instr);
65998                      return;
65999                    }
66000                    Condition condition((instr >> 28) & 0xf);
66001                    unsigned rd = ExtractSRegister(instr, 22, 12);
66002                    unsigned rn = ExtractSRegister(instr, 7, 16);
66003                    unsigned rm = ExtractSRegister(instr, 5, 0);
66004                    // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66005                    vnmla(condition,
66006                          F32,
66007                          SRegister(rd),
66008                          SRegister(rn),
66009                          SRegister(rm));
66010                    break;
66011                  }
66012                  case 0x00000100: {
66013                    // 0x0e100b00
66014                    if (((instr & 0xf0000000) == 0xf0000000)) {
66015                      UnallocatedA32(instr);
66016                      return;
66017                    }
66018                    Condition condition((instr >> 28) & 0xf);
66019                    unsigned rd = ExtractDRegister(instr, 22, 12);
66020                    unsigned rn = ExtractDRegister(instr, 7, 16);
66021                    unsigned rm = ExtractDRegister(instr, 5, 0);
66022                    // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66023                    vnmls(condition,
66024                          F64,
66025                          DRegister(rd),
66026                          DRegister(rn),
66027                          DRegister(rm));
66028                    break;
66029                  }
66030                  case 0x00000140: {
66031                    // 0x0e100b40
66032                    if (((instr & 0xf0000000) == 0xf0000000)) {
66033                      UnallocatedA32(instr);
66034                      return;
66035                    }
66036                    Condition condition((instr >> 28) & 0xf);
66037                    unsigned rd = ExtractDRegister(instr, 22, 12);
66038                    unsigned rn = ExtractDRegister(instr, 7, 16);
66039                    unsigned rm = ExtractDRegister(instr, 5, 0);
66040                    // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66041                    vnmla(condition,
66042                          F64,
66043                          DRegister(rd),
66044                          DRegister(rn),
66045                          DRegister(rm));
66046                    break;
66047                  }
66048                  case 0x00200000: {
66049                    // 0x0e300a00
66050                    if (((instr & 0xf0000000) == 0xf0000000)) {
66051                      UnallocatedA32(instr);
66052                      return;
66053                    }
66054                    Condition condition((instr >> 28) & 0xf);
66055                    unsigned rd = ExtractSRegister(instr, 22, 12);
66056                    unsigned rn = ExtractSRegister(instr, 7, 16);
66057                    unsigned rm = ExtractSRegister(instr, 5, 0);
66058                    // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66059                    vadd(condition,
66060                         F32,
66061                         SRegister(rd),
66062                         SRegister(rn),
66063                         SRegister(rm));
66064                    break;
66065                  }
66066                  case 0x00200040: {
66067                    // 0x0e300a40
66068                    if (((instr & 0xf0000000) == 0xf0000000)) {
66069                      UnallocatedA32(instr);
66070                      return;
66071                    }
66072                    Condition condition((instr >> 28) & 0xf);
66073                    unsigned rd = ExtractSRegister(instr, 22, 12);
66074                    unsigned rn = ExtractSRegister(instr, 7, 16);
66075                    unsigned rm = ExtractSRegister(instr, 5, 0);
66076                    // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66077                    vsub(condition,
66078                         F32,
66079                         SRegister(rd),
66080                         SRegister(rn),
66081                         SRegister(rm));
66082                    break;
66083                  }
66084                  case 0x00200100: {
66085                    // 0x0e300b00
66086                    if (((instr & 0xf0000000) == 0xf0000000)) {
66087                      UnallocatedA32(instr);
66088                      return;
66089                    }
66090                    Condition condition((instr >> 28) & 0xf);
66091                    unsigned rd = ExtractDRegister(instr, 22, 12);
66092                    unsigned rn = ExtractDRegister(instr, 7, 16);
66093                    unsigned rm = ExtractDRegister(instr, 5, 0);
66094                    // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66095                    vadd(condition,
66096                         F64,
66097                         DRegister(rd),
66098                         DRegister(rn),
66099                         DRegister(rm));
66100                    break;
66101                  }
66102                  case 0x00200140: {
66103                    // 0x0e300b40
66104                    if (((instr & 0xf0000000) == 0xf0000000)) {
66105                      UnallocatedA32(instr);
66106                      return;
66107                    }
66108                    Condition condition((instr >> 28) & 0xf);
66109                    unsigned rd = ExtractDRegister(instr, 22, 12);
66110                    unsigned rn = ExtractDRegister(instr, 7, 16);
66111                    unsigned rm = ExtractDRegister(instr, 5, 0);
66112                    // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66113                    vsub(condition,
66114                         F64,
66115                         DRegister(rd),
66116                         DRegister(rn),
66117                         DRegister(rm));
66118                    break;
66119                  }
66120                  case 0x00800000: {
66121                    // 0x0e900a00
66122                    if (((instr & 0xf0000000) == 0xf0000000)) {
66123                      UnallocatedA32(instr);
66124                      return;
66125                    }
66126                    Condition condition((instr >> 28) & 0xf);
66127                    unsigned rd = ExtractSRegister(instr, 22, 12);
66128                    unsigned rn = ExtractSRegister(instr, 7, 16);
66129                    unsigned rm = ExtractSRegister(instr, 5, 0);
66130                    // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66131                    vfnms(condition,
66132                          F32,
66133                          SRegister(rd),
66134                          SRegister(rn),
66135                          SRegister(rm));
66136                    break;
66137                  }
66138                  case 0x00800040: {
66139                    // 0x0e900a40
66140                    if (((instr & 0xf0000000) == 0xf0000000)) {
66141                      UnallocatedA32(instr);
66142                      return;
66143                    }
66144                    Condition condition((instr >> 28) & 0xf);
66145                    unsigned rd = ExtractSRegister(instr, 22, 12);
66146                    unsigned rn = ExtractSRegister(instr, 7, 16);
66147                    unsigned rm = ExtractSRegister(instr, 5, 0);
66148                    // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66149                    vfnma(condition,
66150                          F32,
66151                          SRegister(rd),
66152                          SRegister(rn),
66153                          SRegister(rm));
66154                    break;
66155                  }
66156                  case 0x00800100: {
66157                    // 0x0e900b00
66158                    if (((instr & 0xf0000000) == 0xf0000000)) {
66159                      UnallocatedA32(instr);
66160                      return;
66161                    }
66162                    Condition condition((instr >> 28) & 0xf);
66163                    unsigned rd = ExtractDRegister(instr, 22, 12);
66164                    unsigned rn = ExtractDRegister(instr, 7, 16);
66165                    unsigned rm = ExtractDRegister(instr, 5, 0);
66166                    // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66167                    vfnms(condition,
66168                          F64,
66169                          DRegister(rd),
66170                          DRegister(rn),
66171                          DRegister(rm));
66172                    break;
66173                  }
66174                  case 0x00800140: {
66175                    // 0x0e900b40
66176                    if (((instr & 0xf0000000) == 0xf0000000)) {
66177                      UnallocatedA32(instr);
66178                      return;
66179                    }
66180                    Condition condition((instr >> 28) & 0xf);
66181                    unsigned rd = ExtractDRegister(instr, 22, 12);
66182                    unsigned rn = ExtractDRegister(instr, 7, 16);
66183                    unsigned rm = ExtractDRegister(instr, 5, 0);
66184                    // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66185                    vfnma(condition,
66186                          F64,
66187                          DRegister(rd),
66188                          DRegister(rn),
66189                          DRegister(rm));
66190                    break;
66191                  }
66192                  case 0x00a00000: {
66193                    // 0x0eb00a00
66194                    if (((instr & 0xf0000000) == 0xf0000000)) {
66195                      UnallocatedA32(instr);
66196                      return;
66197                    }
66198                    Condition condition((instr >> 28) & 0xf);
66199                    unsigned rd = ExtractSRegister(instr, 22, 12);
66200                    uint32_t encoded_imm =
66201                        (instr & 0xf) | ((instr >> 12) & 0xf0);
66202                    NeonImmediate imm =
66203                        ImmediateVFP::Decode<float>(encoded_imm);
66204                    // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; A2
66205                    vmov(condition, F32, SRegister(rd), imm);
66206                    if (((instr & 0xfb00ff0) != 0xeb00a00)) {
66207                      UnpredictableA32(instr);
66208                    }
66209                    break;
66210                  }
66211                  case 0x00a00040: {
66212                    // 0x0eb00a40
66213                    switch (instr & 0x000e0000) {
66214                      case 0x00000000: {
66215                        // 0x0eb00a40
66216                        switch (instr & 0x00010080) {
66217                          case 0x00000000: {
66218                            // 0x0eb00a40
66219                            if (((instr & 0xf0000000) == 0xf0000000)) {
66220                              UnallocatedA32(instr);
66221                              return;
66222                            }
66223                            Condition condition((instr >> 28) & 0xf);
66224                            unsigned rd = ExtractSRegister(instr, 22, 12);
66225                            unsigned rm = ExtractSRegister(instr, 5, 0);
66226                            // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66227                            vmov(condition, F32, SRegister(rd), SRegister(rm));
66228                            break;
66229                          }
66230                          case 0x00000080: {
66231                            // 0x0eb00ac0
66232                            if (((instr & 0xf0000000) == 0xf0000000)) {
66233                              UnallocatedA32(instr);
66234                              return;
66235                            }
66236                            Condition condition((instr >> 28) & 0xf);
66237                            unsigned rd = ExtractSRegister(instr, 22, 12);
66238                            unsigned rm = ExtractSRegister(instr, 5, 0);
66239                            // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66240                            vabs(condition, F32, SRegister(rd), SRegister(rm));
66241                            break;
66242                          }
66243                          case 0x00010000: {
66244                            // 0x0eb10a40
66245                            if (((instr & 0xf0000000) == 0xf0000000)) {
66246                              UnallocatedA32(instr);
66247                              return;
66248                            }
66249                            Condition condition((instr >> 28) & 0xf);
66250                            unsigned rd = ExtractSRegister(instr, 22, 12);
66251                            unsigned rm = ExtractSRegister(instr, 5, 0);
66252                            // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66253                            vneg(condition, F32, SRegister(rd), SRegister(rm));
66254                            break;
66255                          }
66256                          case 0x00010080: {
66257                            // 0x0eb10ac0
66258                            if (((instr & 0xf0000000) == 0xf0000000)) {
66259                              UnallocatedA32(instr);
66260                              return;
66261                            }
66262                            Condition condition((instr >> 28) & 0xf);
66263                            unsigned rd = ExtractSRegister(instr, 22, 12);
66264                            unsigned rm = ExtractSRegister(instr, 5, 0);
66265                            // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66266                            vsqrt(condition, F32, SRegister(rd), SRegister(rm));
66267                            break;
66268                          }
66269                        }
66270                        break;
66271                      }
66272                      case 0x00020000: {
66273                        // 0x0eb20a40
66274                        switch (instr & 0x00010080) {
66275                          case 0x00000000: {
66276                            // 0x0eb20a40
66277                            if (((instr & 0xf0000000) == 0xf0000000)) {
66278                              UnallocatedA32(instr);
66279                              return;
66280                            }
66281                            Condition condition((instr >> 28) & 0xf);
66282                            unsigned rd = ExtractSRegister(instr, 22, 12);
66283                            unsigned rm = ExtractSRegister(instr, 5, 0);
66284                            // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
66285                            vcvtb(condition,
66286                                  F32,
66287                                  F16,
66288                                  SRegister(rd),
66289                                  SRegister(rm));
66290                            break;
66291                          }
66292                          case 0x00000080: {
66293                            // 0x0eb20ac0
66294                            if (((instr & 0xf0000000) == 0xf0000000)) {
66295                              UnallocatedA32(instr);
66296                              return;
66297                            }
66298                            Condition condition((instr >> 28) & 0xf);
66299                            unsigned rd = ExtractSRegister(instr, 22, 12);
66300                            unsigned rm = ExtractSRegister(instr, 5, 0);
66301                            // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
66302                            vcvtt(condition,
66303                                  F32,
66304                                  F16,
66305                                  SRegister(rd),
66306                                  SRegister(rm));
66307                            break;
66308                          }
66309                          case 0x00010000: {
66310                            // 0x0eb30a40
66311                            if (((instr & 0xf0000000) == 0xf0000000)) {
66312                              UnallocatedA32(instr);
66313                              return;
66314                            }
66315                            Condition condition((instr >> 28) & 0xf);
66316                            unsigned rd = ExtractSRegister(instr, 22, 12);
66317                            unsigned rm = ExtractSRegister(instr, 5, 0);
66318                            // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
66319                            vcvtb(condition,
66320                                  F16,
66321                                  F32,
66322                                  SRegister(rd),
66323                                  SRegister(rm));
66324                            break;
66325                          }
66326                          case 0x00010080: {
66327                            // 0x0eb30ac0
66328                            if (((instr & 0xf0000000) == 0xf0000000)) {
66329                              UnallocatedA32(instr);
66330                              return;
66331                            }
66332                            Condition condition((instr >> 28) & 0xf);
66333                            unsigned rd = ExtractSRegister(instr, 22, 12);
66334                            unsigned rm = ExtractSRegister(instr, 5, 0);
66335                            // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
66336                            vcvtt(condition,
66337                                  F16,
66338                                  F32,
66339                                  SRegister(rd),
66340                                  SRegister(rm));
66341                            break;
66342                          }
66343                        }
66344                        break;
66345                      }
66346                      case 0x00040000: {
66347                        // 0x0eb40a40
66348                        switch (instr & 0x00010080) {
66349                          case 0x00000000: {
66350                            // 0x0eb40a40
66351                            if (((instr & 0xf0000000) == 0xf0000000)) {
66352                              UnallocatedA32(instr);
66353                              return;
66354                            }
66355                            Condition condition((instr >> 28) & 0xf);
66356                            unsigned rd = ExtractSRegister(instr, 22, 12);
66357                            unsigned rm = ExtractSRegister(instr, 5, 0);
66358                            // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66359                            vcmp(condition, F32, SRegister(rd), SRegister(rm));
66360                            break;
66361                          }
66362                          case 0x00000080: {
66363                            // 0x0eb40ac0
66364                            if (((instr & 0xf0000000) == 0xf0000000)) {
66365                              UnallocatedA32(instr);
66366                              return;
66367                            }
66368                            Condition condition((instr >> 28) & 0xf);
66369                            unsigned rd = ExtractSRegister(instr, 22, 12);
66370                            unsigned rm = ExtractSRegister(instr, 5, 0);
66371                            // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66372                            vcmpe(condition, F32, SRegister(rd), SRegister(rm));
66373                            break;
66374                          }
66375                          case 0x00010000: {
66376                            // 0x0eb50a40
66377                            if (((instr & 0xf0000000) == 0xf0000000)) {
66378                              UnallocatedA32(instr);
66379                              return;
66380                            }
66381                            Condition condition((instr >> 28) & 0xf);
66382                            unsigned rd = ExtractSRegister(instr, 22, 12);
66383                            // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
66384                            vcmp(condition, F32, SRegister(rd), 0.0);
66385                            if (((instr & 0xfbf0fff) != 0xeb50a40)) {
66386                              UnpredictableA32(instr);
66387                            }
66388                            break;
66389                          }
66390                          case 0x00010080: {
66391                            // 0x0eb50ac0
66392                            if (((instr & 0xf0000000) == 0xf0000000)) {
66393                              UnallocatedA32(instr);
66394                              return;
66395                            }
66396                            Condition condition((instr >> 28) & 0xf);
66397                            unsigned rd = ExtractSRegister(instr, 22, 12);
66398                            // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
66399                            vcmpe(condition, F32, SRegister(rd), 0.0);
66400                            if (((instr & 0xfbf0fff) != 0xeb50ac0)) {
66401                              UnpredictableA32(instr);
66402                            }
66403                            break;
66404                          }
66405                        }
66406                        break;
66407                      }
66408                      case 0x00060000: {
66409                        // 0x0eb60a40
66410                        switch (instr & 0x00010080) {
66411                          case 0x00000000: {
66412                            // 0x0eb60a40
66413                            if (((instr & 0xf0000000) == 0xf0000000)) {
66414                              UnallocatedA32(instr);
66415                              return;
66416                            }
66417                            Condition condition((instr >> 28) & 0xf);
66418                            unsigned rd = ExtractSRegister(instr, 22, 12);
66419                            unsigned rm = ExtractSRegister(instr, 5, 0);
66420                            // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66421                            vrintr(condition,
66422                                   F32,
66423                                   SRegister(rd),
66424                                   SRegister(rm));
66425                            break;
66426                          }
66427                          case 0x00000080: {
66428                            // 0x0eb60ac0
66429                            if (((instr & 0xf0000000) == 0xf0000000)) {
66430                              UnallocatedA32(instr);
66431                              return;
66432                            }
66433                            Condition condition((instr >> 28) & 0xf);
66434                            unsigned rd = ExtractSRegister(instr, 22, 12);
66435                            unsigned rm = ExtractSRegister(instr, 5, 0);
66436                            // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66437                            vrintz(condition,
66438                                   F32,
66439                                   SRegister(rd),
66440                                   SRegister(rm));
66441                            break;
66442                          }
66443                          case 0x00010000: {
66444                            // 0x0eb70a40
66445                            if (((instr & 0xf0000000) == 0xf0000000)) {
66446                              UnallocatedA32(instr);
66447                              return;
66448                            }
66449                            Condition condition((instr >> 28) & 0xf);
66450                            unsigned rd = ExtractSRegister(instr, 22, 12);
66451                            unsigned rm = ExtractSRegister(instr, 5, 0);
66452                            // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66453                            vrintx(condition,
66454                                   F32,
66455                                   SRegister(rd),
66456                                   SRegister(rm));
66457                            break;
66458                          }
66459                          case 0x00010080: {
66460                            // 0x0eb70ac0
66461                            if (((instr & 0xf0000000) == 0xf0000000)) {
66462                              UnallocatedA32(instr);
66463                              return;
66464                            }
66465                            Condition condition((instr >> 28) & 0xf);
66466                            unsigned rd = ExtractDRegister(instr, 22, 12);
66467                            unsigned rm = ExtractSRegister(instr, 5, 0);
66468                            // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; A1
66469                            vcvt(condition,
66470                                 F64,
66471                                 F32,
66472                                 DRegister(rd),
66473                                 SRegister(rm));
66474                            break;
66475                          }
66476                        }
66477                        break;
66478                      }
66479                      case 0x00080000: {
66480                        // 0x0eb80a40
66481                        if ((instr & 0x00010000) == 0x00000000) {
66482                          if (((instr & 0xf0000000) == 0xf0000000)) {
66483                            UnallocatedA32(instr);
66484                            return;
66485                          }
66486                          Condition condition((instr >> 28) & 0xf);
66487                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
66488                          if (dt.Is(kDataTypeValueInvalid)) {
66489                            UnallocatedA32(instr);
66490                            return;
66491                          }
66492                          unsigned rd = ExtractSRegister(instr, 22, 12);
66493                          unsigned rm = ExtractSRegister(instr, 5, 0);
66494                          // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; A1
66495                          vcvt(condition,
66496                               F32,
66497                               dt,
66498                               SRegister(rd),
66499                               SRegister(rm));
66500                        } else {
66501                          UnallocatedA32(instr);
66502                        }
66503                        break;
66504                      }
66505                      case 0x000a0000: {
66506                        // 0x0eba0a40
66507                        if (((instr & 0xf0000000) == 0xf0000000)) {
66508                          UnallocatedA32(instr);
66509                          return;
66510                        }
66511                        Condition condition((instr >> 28) & 0xf);
66512                        DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
66513                                                       ((instr >> 15) & 0x2));
66514                        if (dt.Is(kDataTypeValueInvalid)) {
66515                          UnallocatedA32(instr);
66516                          return;
66517                        }
66518                        unsigned rd = ExtractSRegister(instr, 22, 12);
66519                        unsigned offset = 32;
66520                        if (dt.Is(S16) || dt.Is(U16)) {
66521                          offset = 16;
66522                        }
66523                        uint32_t fbits = offset - (((instr >> 5) & 0x1) |
66524                                                   ((instr << 1) & 0x1e));
66525                        // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; A1
66526                        vcvt(condition,
66527                             F32,
66528                             dt,
66529                             SRegister(rd),
66530                             SRegister(rd),
66531                             fbits);
66532                        break;
66533                      }
66534                      case 0x000c0000: {
66535                        // 0x0ebc0a40
66536                        switch (instr & 0x00010080) {
66537                          case 0x00000000: {
66538                            // 0x0ebc0a40
66539                            if (((instr & 0xf0000000) == 0xf0000000)) {
66540                              UnallocatedA32(instr);
66541                              return;
66542                            }
66543                            Condition condition((instr >> 28) & 0xf);
66544                            unsigned rd = ExtractSRegister(instr, 22, 12);
66545                            unsigned rm = ExtractSRegister(instr, 5, 0);
66546                            // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
66547                            vcvtr(condition,
66548                                  U32,
66549                                  F32,
66550                                  SRegister(rd),
66551                                  SRegister(rm));
66552                            break;
66553                          }
66554                          case 0x00000080: {
66555                            // 0x0ebc0ac0
66556                            if (((instr & 0xf0000000) == 0xf0000000)) {
66557                              UnallocatedA32(instr);
66558                              return;
66559                            }
66560                            Condition condition((instr >> 28) & 0xf);
66561                            unsigned rd = ExtractSRegister(instr, 22, 12);
66562                            unsigned rm = ExtractSRegister(instr, 5, 0);
66563                            // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
66564                            vcvt(condition,
66565                                 U32,
66566                                 F32,
66567                                 SRegister(rd),
66568                                 SRegister(rm));
66569                            break;
66570                          }
66571                          case 0x00010000: {
66572                            // 0x0ebd0a40
66573                            if (((instr & 0xf0000000) == 0xf0000000)) {
66574                              UnallocatedA32(instr);
66575                              return;
66576                            }
66577                            Condition condition((instr >> 28) & 0xf);
66578                            unsigned rd = ExtractSRegister(instr, 22, 12);
66579                            unsigned rm = ExtractSRegister(instr, 5, 0);
66580                            // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
66581                            vcvtr(condition,
66582                                  S32,
66583                                  F32,
66584                                  SRegister(rd),
66585                                  SRegister(rm));
66586                            break;
66587                          }
66588                          case 0x00010080: {
66589                            // 0x0ebd0ac0
66590                            if (((instr & 0xf0000000) == 0xf0000000)) {
66591                              UnallocatedA32(instr);
66592                              return;
66593                            }
66594                            Condition condition((instr >> 28) & 0xf);
66595                            unsigned rd = ExtractSRegister(instr, 22, 12);
66596                            unsigned rm = ExtractSRegister(instr, 5, 0);
66597                            // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
66598                            vcvt(condition,
66599                                 S32,
66600                                 F32,
66601                                 SRegister(rd),
66602                                 SRegister(rm));
66603                            break;
66604                          }
66605                        }
66606                        break;
66607                      }
66608                      case 0x000e0000: {
66609                        // 0x0ebe0a40
66610                        if (((instr & 0xf0000000) == 0xf0000000)) {
66611                          UnallocatedA32(instr);
66612                          return;
66613                        }
66614                        Condition condition((instr >> 28) & 0xf);
66615                        DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
66616                                                       ((instr >> 15) & 0x2));
66617                        if (dt.Is(kDataTypeValueInvalid)) {
66618                          UnallocatedA32(instr);
66619                          return;
66620                        }
66621                        unsigned rd = ExtractSRegister(instr, 22, 12);
66622                        unsigned offset = 32;
66623                        if (dt.Is(S16) || dt.Is(U16)) {
66624                          offset = 16;
66625                        }
66626                        uint32_t fbits = offset - (((instr >> 5) & 0x1) |
66627                                                   ((instr << 1) & 0x1e));
66628                        // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; A1
66629                        vcvt(condition,
66630                             dt,
66631                             F32,
66632                             SRegister(rd),
66633                             SRegister(rd),
66634                             fbits);
66635                        break;
66636                      }
66637                    }
66638                    break;
66639                  }
66640                  case 0x00a00100: {
66641                    // 0x0eb00b00
66642                    if (((instr & 0xf0000000) == 0xf0000000)) {
66643                      UnallocatedA32(instr);
66644                      return;
66645                    }
66646                    Condition condition((instr >> 28) & 0xf);
66647                    unsigned rd = ExtractDRegister(instr, 22, 12);
66648                    uint32_t encoded_imm =
66649                        (instr & 0xf) | ((instr >> 12) & 0xf0);
66650                    NeonImmediate imm =
66651                        ImmediateVFP::Decode<double>(encoded_imm);
66652                    // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; A2
66653                    vmov(condition, F64, DRegister(rd), imm);
66654                    if (((instr & 0xfb00ff0) != 0xeb00b00)) {
66655                      UnpredictableA32(instr);
66656                    }
66657                    break;
66658                  }
66659                  case 0x00a00140: {
66660                    // 0x0eb00b40
66661                    switch (instr & 0x000e0000) {
66662                      case 0x00000000: {
66663                        // 0x0eb00b40
66664                        switch (instr & 0x00010080) {
66665                          case 0x00000000: {
66666                            // 0x0eb00b40
66667                            if (((instr & 0xf0000000) == 0xf0000000)) {
66668                              UnallocatedA32(instr);
66669                              return;
66670                            }
66671                            Condition condition((instr >> 28) & 0xf);
66672                            unsigned rd = ExtractDRegister(instr, 22, 12);
66673                            unsigned rm = ExtractDRegister(instr, 5, 0);
66674                            // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
66675                            vmov(condition, F64, DRegister(rd), DRegister(rm));
66676                            break;
66677                          }
66678                          case 0x00000080: {
66679                            // 0x0eb00bc0
66680                            if (((instr & 0xf0000000) == 0xf0000000)) {
66681                              UnallocatedA32(instr);
66682                              return;
66683                            }
66684                            Condition condition((instr >> 28) & 0xf);
66685                            unsigned rd = ExtractDRegister(instr, 22, 12);
66686                            unsigned rm = ExtractDRegister(instr, 5, 0);
66687                            // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
66688                            vabs(condition, F64, DRegister(rd), DRegister(rm));
66689                            break;
66690                          }
66691                          case 0x00010000: {
66692                            // 0x0eb10b40
66693                            if (((instr & 0xf0000000) == 0xf0000000)) {
66694                              UnallocatedA32(instr);
66695                              return;
66696                            }
66697                            Condition condition((instr >> 28) & 0xf);
66698                            unsigned rd = ExtractDRegister(instr, 22, 12);
66699                            unsigned rm = ExtractDRegister(instr, 5, 0);
66700                            // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
66701                            vneg(condition, F64, DRegister(rd), DRegister(rm));
66702                            break;
66703                          }
66704                          case 0x00010080: {
66705                            // 0x0eb10bc0
66706                            if (((instr & 0xf0000000) == 0xf0000000)) {
66707                              UnallocatedA32(instr);
66708                              return;
66709                            }
66710                            Condition condition((instr >> 28) & 0xf);
66711                            unsigned rd = ExtractDRegister(instr, 22, 12);
66712                            unsigned rm = ExtractDRegister(instr, 5, 0);
66713                            // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66714                            vsqrt(condition, F64, DRegister(rd), DRegister(rm));
66715                            break;
66716                          }
66717                        }
66718                        break;
66719                      }
66720                      case 0x00020000: {
66721                        // 0x0eb20b40
66722                        switch (instr & 0x00010080) {
66723                          case 0x00000000: {
66724                            // 0x0eb20b40
66725                            if (((instr & 0xf0000000) == 0xf0000000)) {
66726                              UnallocatedA32(instr);
66727                              return;
66728                            }
66729                            Condition condition((instr >> 28) & 0xf);
66730                            unsigned rd = ExtractDRegister(instr, 22, 12);
66731                            unsigned rm = ExtractSRegister(instr, 5, 0);
66732                            // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
66733                            vcvtb(condition,
66734                                  F64,
66735                                  F16,
66736                                  DRegister(rd),
66737                                  SRegister(rm));
66738                            break;
66739                          }
66740                          case 0x00000080: {
66741                            // 0x0eb20bc0
66742                            if (((instr & 0xf0000000) == 0xf0000000)) {
66743                              UnallocatedA32(instr);
66744                              return;
66745                            }
66746                            Condition condition((instr >> 28) & 0xf);
66747                            unsigned rd = ExtractDRegister(instr, 22, 12);
66748                            unsigned rm = ExtractSRegister(instr, 5, 0);
66749                            // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
66750                            vcvtt(condition,
66751                                  F64,
66752                                  F16,
66753                                  DRegister(rd),
66754                                  SRegister(rm));
66755                            break;
66756                          }
66757                          case 0x00010000: {
66758                            // 0x0eb30b40
66759                            if (((instr & 0xf0000000) == 0xf0000000)) {
66760                              UnallocatedA32(instr);
66761                              return;
66762                            }
66763                            Condition condition((instr >> 28) & 0xf);
66764                            unsigned rd = ExtractSRegister(instr, 22, 12);
66765                            unsigned rm = ExtractDRegister(instr, 5, 0);
66766                            // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
66767                            vcvtb(condition,
66768                                  F16,
66769                                  F64,
66770                                  SRegister(rd),
66771                                  DRegister(rm));
66772                            break;
66773                          }
66774                          case 0x00010080: {
66775                            // 0x0eb30bc0
66776                            if (((instr & 0xf0000000) == 0xf0000000)) {
66777                              UnallocatedA32(instr);
66778                              return;
66779                            }
66780                            Condition condition((instr >> 28) & 0xf);
66781                            unsigned rd = ExtractSRegister(instr, 22, 12);
66782                            unsigned rm = ExtractDRegister(instr, 5, 0);
66783                            // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
66784                            vcvtt(condition,
66785                                  F16,
66786                                  F64,
66787                                  SRegister(rd),
66788                                  DRegister(rm));
66789                            break;
66790                          }
66791                        }
66792                        break;
66793                      }
66794                      case 0x00040000: {
66795                        // 0x0eb40b40
66796                        switch (instr & 0x00010080) {
66797                          case 0x00000000: {
66798                            // 0x0eb40b40
66799                            if (((instr & 0xf0000000) == 0xf0000000)) {
66800                              UnallocatedA32(instr);
66801                              return;
66802                            }
66803                            Condition condition((instr >> 28) & 0xf);
66804                            unsigned rd = ExtractDRegister(instr, 22, 12);
66805                            unsigned rm = ExtractDRegister(instr, 5, 0);
66806                            // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66807                            vcmp(condition, F64, DRegister(rd), DRegister(rm));
66808                            break;
66809                          }
66810                          case 0x00000080: {
66811                            // 0x0eb40bc0
66812                            if (((instr & 0xf0000000) == 0xf0000000)) {
66813                              UnallocatedA32(instr);
66814                              return;
66815                            }
66816                            Condition condition((instr >> 28) & 0xf);
66817                            unsigned rd = ExtractDRegister(instr, 22, 12);
66818                            unsigned rm = ExtractDRegister(instr, 5, 0);
66819                            // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66820                            vcmpe(condition, F64, DRegister(rd), DRegister(rm));
66821                            break;
66822                          }
66823                          case 0x00010000: {
66824                            // 0x0eb50b40
66825                            if (((instr & 0xf0000000) == 0xf0000000)) {
66826                              UnallocatedA32(instr);
66827                              return;
66828                            }
66829                            Condition condition((instr >> 28) & 0xf);
66830                            unsigned rd = ExtractDRegister(instr, 22, 12);
66831                            // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
66832                            vcmp(condition, F64, DRegister(rd), 0.0);
66833                            if (((instr & 0xfbf0fff) != 0xeb50b40)) {
66834                              UnpredictableA32(instr);
66835                            }
66836                            break;
66837                          }
66838                          case 0x00010080: {
66839                            // 0x0eb50bc0
66840                            if (((instr & 0xf0000000) == 0xf0000000)) {
66841                              UnallocatedA32(instr);
66842                              return;
66843                            }
66844                            Condition condition((instr >> 28) & 0xf);
66845                            unsigned rd = ExtractDRegister(instr, 22, 12);
66846                            // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
66847                            vcmpe(condition, F64, DRegister(rd), 0.0);
66848                            if (((instr & 0xfbf0fff) != 0xeb50bc0)) {
66849                              UnpredictableA32(instr);
66850                            }
66851                            break;
66852                          }
66853                        }
66854                        break;
66855                      }
66856                      case 0x00060000: {
66857                        // 0x0eb60b40
66858                        switch (instr & 0x00010080) {
66859                          case 0x00000000: {
66860                            // 0x0eb60b40
66861                            if (((instr & 0xf0000000) == 0xf0000000)) {
66862                              UnallocatedA32(instr);
66863                              return;
66864                            }
66865                            Condition condition((instr >> 28) & 0xf);
66866                            unsigned rd = ExtractDRegister(instr, 22, 12);
66867                            unsigned rm = ExtractDRegister(instr, 5, 0);
66868                            // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66869                            vrintr(condition,
66870                                   F64,
66871                                   DRegister(rd),
66872                                   DRegister(rm));
66873                            break;
66874                          }
66875                          case 0x00000080: {
66876                            // 0x0eb60bc0
66877                            if (((instr & 0xf0000000) == 0xf0000000)) {
66878                              UnallocatedA32(instr);
66879                              return;
66880                            }
66881                            Condition condition((instr >> 28) & 0xf);
66882                            unsigned rd = ExtractDRegister(instr, 22, 12);
66883                            unsigned rm = ExtractDRegister(instr, 5, 0);
66884                            // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66885                            vrintz(condition,
66886                                   F64,
66887                                   DRegister(rd),
66888                                   DRegister(rm));
66889                            break;
66890                          }
66891                          case 0x00010000: {
66892                            // 0x0eb70b40
66893                            if (((instr & 0xf0000000) == 0xf0000000)) {
66894                              UnallocatedA32(instr);
66895                              return;
66896                            }
66897                            Condition condition((instr >> 28) & 0xf);
66898                            unsigned rd = ExtractDRegister(instr, 22, 12);
66899                            unsigned rm = ExtractDRegister(instr, 5, 0);
66900                            // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
66901                            vrintx(condition,
66902                                   F64,
66903                                   DRegister(rd),
66904                                   DRegister(rm));
66905                            break;
66906                          }
66907                          case 0x00010080: {
66908                            // 0x0eb70bc0
66909                            if (((instr & 0xf0000000) == 0xf0000000)) {
66910                              UnallocatedA32(instr);
66911                              return;
66912                            }
66913                            Condition condition((instr >> 28) & 0xf);
66914                            unsigned rd = ExtractSRegister(instr, 22, 12);
66915                            unsigned rm = ExtractDRegister(instr, 5, 0);
66916                            // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; A1
66917                            vcvt(condition,
66918                                 F32,
66919                                 F64,
66920                                 SRegister(rd),
66921                                 DRegister(rm));
66922                            break;
66923                          }
66924                        }
66925                        break;
66926                      }
66927                      case 0x00080000: {
66928                        // 0x0eb80b40
66929                        if ((instr & 0x00010000) == 0x00000000) {
66930                          if (((instr & 0xf0000000) == 0xf0000000)) {
66931                            UnallocatedA32(instr);
66932                            return;
66933                          }
66934                          Condition condition((instr >> 28) & 0xf);
66935                          DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
66936                          if (dt.Is(kDataTypeValueInvalid)) {
66937                            UnallocatedA32(instr);
66938                            return;
66939                          }
66940                          unsigned rd = ExtractDRegister(instr, 22, 12);
66941                          unsigned rm = ExtractSRegister(instr, 5, 0);
66942                          // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; A1
66943                          vcvt(condition,
66944                               F64,
66945                               dt,
66946                               DRegister(rd),
66947                               SRegister(rm));
66948                        } else {
66949                          UnallocatedA32(instr);
66950                        }
66951                        break;
66952                      }
66953                      case 0x000a0000: {
66954                        // 0x0eba0b40
66955                        if (((instr & 0xf0000000) == 0xf0000000)) {
66956                          UnallocatedA32(instr);
66957                          return;
66958                        }
66959                        Condition condition((instr >> 28) & 0xf);
66960                        DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
66961                                                       ((instr >> 15) & 0x2));
66962                        if (dt.Is(kDataTypeValueInvalid)) {
66963                          UnallocatedA32(instr);
66964                          return;
66965                        }
66966                        unsigned rd = ExtractDRegister(instr, 22, 12);
66967                        unsigned offset = 32;
66968                        if (dt.Is(S16) || dt.Is(U16)) {
66969                          offset = 16;
66970                        }
66971                        uint32_t fbits = offset - (((instr >> 5) & 0x1) |
66972                                                   ((instr << 1) & 0x1e));
66973                        // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; A1
66974                        vcvt(condition,
66975                             F64,
66976                             dt,
66977                             DRegister(rd),
66978                             DRegister(rd),
66979                             fbits);
66980                        break;
66981                      }
66982                      case 0x000c0000: {
66983                        // 0x0ebc0b40
66984                        switch (instr & 0x00010080) {
66985                          case 0x00000000: {
66986                            // 0x0ebc0b40
66987                            if (((instr & 0xf0000000) == 0xf0000000)) {
66988                              UnallocatedA32(instr);
66989                              return;
66990                            }
66991                            Condition condition((instr >> 28) & 0xf);
66992                            unsigned rd = ExtractSRegister(instr, 22, 12);
66993                            unsigned rm = ExtractDRegister(instr, 5, 0);
66994                            // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
66995                            vcvtr(condition,
66996                                  U32,
66997                                  F64,
66998                                  SRegister(rd),
66999                                  DRegister(rm));
67000                            break;
67001                          }
67002                          case 0x00000080: {
67003                            // 0x0ebc0bc0
67004                            if (((instr & 0xf0000000) == 0xf0000000)) {
67005                              UnallocatedA32(instr);
67006                              return;
67007                            }
67008                            Condition condition((instr >> 28) & 0xf);
67009                            unsigned rd = ExtractSRegister(instr, 22, 12);
67010                            unsigned rm = ExtractDRegister(instr, 5, 0);
67011                            // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
67012                            vcvt(condition,
67013                                 U32,
67014                                 F64,
67015                                 SRegister(rd),
67016                                 DRegister(rm));
67017                            break;
67018                          }
67019                          case 0x00010000: {
67020                            // 0x0ebd0b40
67021                            if (((instr & 0xf0000000) == 0xf0000000)) {
67022                              UnallocatedA32(instr);
67023                              return;
67024                            }
67025                            Condition condition((instr >> 28) & 0xf);
67026                            unsigned rd = ExtractSRegister(instr, 22, 12);
67027                            unsigned rm = ExtractDRegister(instr, 5, 0);
67028                            // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
67029                            vcvtr(condition,
67030                                  S32,
67031                                  F64,
67032                                  SRegister(rd),
67033                                  DRegister(rm));
67034                            break;
67035                          }
67036                          case 0x00010080: {
67037                            // 0x0ebd0bc0
67038                            if (((instr & 0xf0000000) == 0xf0000000)) {
67039                              UnallocatedA32(instr);
67040                              return;
67041                            }
67042                            Condition condition((instr >> 28) & 0xf);
67043                            unsigned rd = ExtractSRegister(instr, 22, 12);
67044                            unsigned rm = ExtractDRegister(instr, 5, 0);
67045                            // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
67046                            vcvt(condition,
67047                                 S32,
67048                                 F64,
67049                                 SRegister(rd),
67050                                 DRegister(rm));
67051                            break;
67052                          }
67053                        }
67054                        break;
67055                      }
67056                      case 0x000e0000: {
67057                        // 0x0ebe0b40
67058                        if (((instr & 0xf0000000) == 0xf0000000)) {
67059                          UnallocatedA32(instr);
67060                          return;
67061                        }
67062                        Condition condition((instr >> 28) & 0xf);
67063                        DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
67064                                                       ((instr >> 15) & 0x2));
67065                        if (dt.Is(kDataTypeValueInvalid)) {
67066                          UnallocatedA32(instr);
67067                          return;
67068                        }
67069                        unsigned rd = ExtractDRegister(instr, 22, 12);
67070                        unsigned offset = 32;
67071                        if (dt.Is(S16) || dt.Is(U16)) {
67072                          offset = 16;
67073                        }
67074                        uint32_t fbits = offset - (((instr >> 5) & 0x1) |
67075                                                   ((instr << 1) & 0x1e));
67076                        // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; A1
67077                        vcvt(condition,
67078                             dt,
67079                             F64,
67080                             DRegister(rd),
67081                             DRegister(rd),
67082                             fbits);
67083                        break;
67084                      }
67085                    }
67086                    break;
67087                  }
67088                }
67089                break;
67090              }
67091              case 0x00100a10: {
67092                // 0x0e100a10
67093                switch (instr & 0x00000100) {
67094                  case 0x00000000: {
67095                    // 0x0e100a10
67096                    switch (instr & 0x00e00000) {
67097                      case 0x00000000: {
67098                        // 0x0e100a10
67099                        if (((instr & 0xf0000000) == 0xf0000000)) {
67100                          UnallocatedA32(instr);
67101                          return;
67102                        }
67103                        Condition condition((instr >> 28) & 0xf);
67104                        unsigned rt = (instr >> 12) & 0xf;
67105                        unsigned rn = ExtractSRegister(instr, 7, 16);
67106                        // VMOV{<c>}{<q>} <Rt>, <Sn> ; A1
67107                        vmov(condition, Register(rt), SRegister(rn));
67108                        if (((instr & 0xff00f7f) != 0xe100a10)) {
67109                          UnpredictableA32(instr);
67110                        }
67111                        break;
67112                      }
67113                      case 0x00e00000: {
67114                        // 0x0ef00a10
67115                        if (((instr & 0xf0000000) == 0xf0000000)) {
67116                          UnallocatedA32(instr);
67117                          return;
67118                        }
67119                        Condition condition((instr >> 28) & 0xf);
67120                        unsigned rt = (instr >> 12) & 0xf;
67121                        unsigned spec_reg = (instr >> 16) & 0xf;
67122                        switch (spec_reg) {
67123                          case 0x0:
67124                          case 0x1:
67125                          case 0x5:
67126                          case 0x6:
67127                          case 0x7:
67128                          case 0x8: {
67129                            // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; A1
67130                            vmrs(condition,
67131                                 RegisterOrAPSR_nzcv(rt),
67132                                 SpecialFPRegister(spec_reg));
67133                            if (((instr & 0xff00fff) != 0xef00a10)) {
67134                              UnpredictableA32(instr);
67135                            }
67136                            break;
67137                          }
67138                          default:
67139                            UnallocatedA32(instr);
67140                            break;
67141                        }
67142                        break;
67143                      }
67144                      default:
67145                        UnallocatedA32(instr);
67146                        break;
67147                    }
67148                    break;
67149                  }
67150                  case 0x00000100: {
67151                    // 0x0e100b10
67152                    if (((instr & 0xf0000000) == 0xf0000000)) {
67153                      UnallocatedA32(instr);
67154                      return;
67155                    }
67156                    Condition condition((instr >> 28) & 0xf);
67157                    unsigned lane;
67158                    DataType dt =
67159                        Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
67160                                                    ((instr >> 19) & 0xc) |
67161                                                    ((instr >> 19) & 0x10),
67162                                                &lane);
67163                    if (dt.Is(kDataTypeValueInvalid)) {
67164                      UnallocatedA32(instr);
67165                      return;
67166                    }
67167                    unsigned rt = (instr >> 12) & 0xf;
67168                    unsigned rn = ExtractDRegister(instr, 7, 16);
67169                    // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; A1
67170                    vmov(condition, dt, Register(rt), DRegisterLane(rn, lane));
67171                    if (((instr & 0xf100f1f) != 0xe100b10)) {
67172                      UnpredictableA32(instr);
67173                    }
67174                    break;
67175                  }
67176                }
67177                break;
67178              }
67179              case 0x00100e10: {
67180                // 0x0e100e10
67181                if (((instr & 0xf0000000) == 0xf0000000)) {
67182                  UnallocatedA32(instr);
67183                  return;
67184                }
67185                UnimplementedA32("MRC", instr);
67186                break;
67187              }
67188              default:
67189                UnallocatedA32(instr);
67190                break;
67191            }
67192            break;
67193          }
67194          case 0x01000000: {
67195            // 0x0f000000
67196            if (((instr & 0xf0000000) == 0xf0000000)) {
67197              UnallocatedA32(instr);
67198              return;
67199            }
67200            Condition condition((instr >> 28) & 0xf);
67201            uint32_t imm = instr & 0xffffff;
67202            // SVC{<c>}{<q>} {#}<imm> ; A1
67203            svc(condition, imm);
67204            break;
67205          }
67206        }
67207        break;
67208      }
67209    }
67210  }
67211}  // NOLINT(readability/fn_size)
67212// End of generated code.
67213
67214const uint16_t* PrintDisassembler::DecodeT32At(
67215    const uint16_t* instruction_address, const uint16_t* buffer_end) {
67216  uint32_t instruction = *instruction_address++ << 16;
67217
67218  if (instruction >= kLowestT32_32Opcode) {
67219    if (instruction_address >= buffer_end) {
67220      os() << "?\n";
67221      return instruction_address;
67222    }
67223    instruction |= *instruction_address++;
67224  }
67225
67226  DecodeT32(instruction);
67227  return instruction_address;
67228}
67229
67230void PrintDisassembler::DecodeT32(uint32_t instruction) {
67231  PrintCodeAddress(GetCodeAddress());
67232  if (T32Size(instruction) == 2) {
67233#ifndef PANDA_BUILD
67234    PrintOpcode16(instruction >> 16);
67235#endif
67236    Disassembler::DecodeT32(instruction);
67237  } else {
67238#ifndef PANDA_BUILD
67239    PrintOpcode32(instruction);
67240#endif
67241    Disassembler::DecodeT32(instruction);
67242  }
67243  os() << "\n";
67244}
67245
67246
67247void PrintDisassembler::DecodeA32(uint32_t instruction) {
67248  PrintCodeAddress(GetCodeAddress());
67249#ifndef PANDA_BUILD
67250  PrintOpcode32(instruction);
67251#endif
67252  Disassembler::DecodeA32(instruction);
67253  os() << "\n";
67254}
67255
67256
67257void PrintDisassembler::DisassembleA32Buffer(const uint32_t* buffer,
67258                                             size_t size_in_bytes) {
67259  VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
67260  VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
67261  const uint32_t* const end_buffer =
67262      buffer + (size_in_bytes / sizeof(uint32_t));
67263  while (buffer < end_buffer) {
67264    DecodeA32(*buffer++);
67265  }
67266}
67267
67268
67269void PrintDisassembler::DisassembleT32Buffer(const uint16_t* buffer,
67270                                             size_t size_in_bytes) {
67271  VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
67272  VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
67273  const uint16_t* const end_buffer =
67274      buffer + (size_in_bytes / sizeof(uint16_t));
67275  while (buffer < end_buffer) {
67276    buffer = DecodeT32At(buffer, end_buffer);
67277  }
67278  VIXL_ASSERT(buffer == end_buffer);
67279}
67280
67281}  // namespace aarch32
67282}  // namespace vixl
67283